@rathnasgala2/schemas 3.13.0 → 3.14.1

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.
@@ -1441,6 +1441,27 @@ components:
1441
1441
  - GOOGLE
1442
1442
  - DESCRIPTION_CODE
1443
1443
  type: string
1444
+ CreatorClaimProof:
1445
+ additionalProperties: false
1446
+ description: What a claimant must show before accepting. `YOUTUBE_CHANNEL` needs the claimant to prove they control the channel (`channelId`, and `handle` when it is known); `LINK_ONLY` needs nothing beyond the link itself, so anyone who holds a `LINK_ONLY` link and signs in can claim the site.
1447
+ properties:
1448
+ channelId:
1449
+ $ref: "#/components/schemas/YoutubeChannelId"
1450
+ handle:
1451
+ maxLength: 31
1452
+ minLength: 4
1453
+ pattern: ^@[A-Za-z0-9._-]{3,30}$
1454
+ type: string
1455
+ kind:
1456
+ $ref: "#/components/schemas/CreatorClaimProofKind"
1457
+ required:
1458
+ - kind
1459
+ type: object
1460
+ CreatorClaimProofKind:
1461
+ enum:
1462
+ - YOUTUBE_CHANNEL
1463
+ - LINK_ONLY
1464
+ type: string
1444
1465
  CreatorClaimState:
1445
1466
  enum:
1446
1467
  - OPEN
@@ -2146,6 +2167,7 @@ components:
2146
2167
  properties:
2147
2168
  channel:
2148
2169
  additionalProperties: false
2170
+ description: Present only when `proof.kind` is `YOUTUBE_CHANNEL`.
2149
2171
  properties:
2150
2172
  handle:
2151
2173
  maxLength: 31
@@ -2165,19 +2187,22 @@ components:
2165
2187
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2166
2188
  type: string
2167
2189
  methods:
2190
+ description: The ways to prove the channel is the caller's; empty when `proof.kind` is `LINK_ONLY`, which has nothing to prove.
2168
2191
  items:
2169
2192
  $ref: "#/components/schemas/CreatorClaimMethod"
2170
2193
  maxItems: 2
2171
- minItems: 1
2194
+ minItems: 0
2172
2195
  type: array
2173
2196
  uniqueItems: true
2174
2197
  organizationId:
2175
- description: Present only when `state` is `CLAIMED` and the caller is the person who claimed it.
2198
+ description: Present only when `state` is `CLAIMED` and the caller is the person who claimed it, or when the caller already owns the site (the owner who issued the link, reading it).
2176
2199
  format: uuid
2177
2200
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2178
2201
  type: string
2202
+ proof:
2203
+ $ref: "#/components/schemas/CreatorClaimProof"
2179
2204
  publicationId:
2180
- description: Present only when `state` is `CLAIMED` and the caller is the person who claimed it.
2205
+ description: Present only when `state` is `CLAIMED` and the caller is the person who claimed it, or when the caller already owns the site (the owner who issued the link, reading it).
2181
2206
  format: uuid
2182
2207
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2183
2208
  type: string
@@ -2202,7 +2227,6 @@ components:
2202
2227
  required:
2203
2228
  - claimId
2204
2229
  - state
2205
- - channel
2206
2230
  - site
2207
2231
  - methods
2208
2232
  type: object
@@ -3128,6 +3152,18 @@ components:
3128
3152
  - periodEndsAt
3129
3153
  - editionKinds
3130
3154
  type: object
3155
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsResponse:
3156
+ additionalProperties: false
3157
+ properties:
3158
+ items:
3159
+ description: Newest first, every state; at most the 50 most recent.
3160
+ items:
3161
+ $ref: "#/components/schemas/HandoverClaim"
3162
+ maxItems: 50
3163
+ type: array
3164
+ required:
3165
+ - items
3166
+ type: object
3131
3167
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverResponse:
3132
3168
  additionalProperties: false
3133
3169
  properties:
@@ -4818,6 +4854,59 @@ components:
4818
4854
  - PRIVATE
4819
4855
  - PUBLIC
4820
4856
  type: string
4857
+ HandoverClaim:
4858
+ additionalProperties: false
4859
+ description: One claim link that hands a site to whoever accepts it. Demo-site claims appear here too, with proof `YOUTUBE_CHANNEL`.
4860
+ properties:
4861
+ claimId:
4862
+ format: uuid
4863
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
4864
+ type: string
4865
+ claimUrl:
4866
+ description: Present only while `state` is `OPEN`, so the owner can copy the link again; absent in every other state. It is also absent on an `OPEN` claim issued before 3.14.0 whose token the API does not hold sealed, until the owner re-issues the claim with `replace`. The link is a bearer secret, so anyone who holds it can open the claim page.
4867
+ format: uri
4868
+ maxLength: 2048
4869
+ pattern: ^https://[^\s]+$
4870
+ type: string
4871
+ claimedAt:
4872
+ $ref: "#/components/schemas/PortableProblemRfc3339"
4873
+ claimedBy:
4874
+ additionalProperties: false
4875
+ description: Present only when `state` is `CLAIMED`.
4876
+ properties:
4877
+ displayName:
4878
+ maxLength: 200
4879
+ minLength: 1
4880
+ type: string
4881
+ login:
4882
+ description: "GitHub login grammar: letters, digits and single hyphens, not starting or ending with a hyphen. Absent when the claimant has no linked GitHub login."
4883
+ maxLength: 39
4884
+ minLength: 1
4885
+ pattern: ^[A-Za-z0-9](?:-?[A-Za-z0-9]){0,38}$
4886
+ type: string
4887
+ required:
4888
+ - displayName
4889
+ type: object
4890
+ createdAt:
4891
+ $ref: "#/components/schemas/PortableProblemRfc3339"
4892
+ expiresAt:
4893
+ $ref: "#/components/schemas/PortableProblemRfc3339"
4894
+ proof:
4895
+ $ref: "#/components/schemas/CreatorClaimProof"
4896
+ state:
4897
+ $ref: "#/components/schemas/CreatorClaimState"
4898
+ version:
4899
+ format: int64
4900
+ minimum: 0
4901
+ type: integer
4902
+ required:
4903
+ - claimId
4904
+ - state
4905
+ - createdAt
4906
+ - expiresAt
4907
+ - proof
4908
+ - version
4909
+ type: object
4821
4910
  HandoverState:
4822
4911
  enum:
4823
4912
  - NOT_STARTED
@@ -14672,6 +14761,30 @@ components:
14672
14761
  - $ref: "#/components/schemas/DomainBinding"
14673
14762
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverCancelResponse:
14674
14763
  $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverResponse"
14764
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsByClaimIdRevokeResponse:
14765
+ $ref: "#/components/schemas/HandoverClaim"
14766
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsRequest:
14767
+ additionalProperties: false
14768
+ properties:
14769
+ channelId:
14770
+ $ref: "#/components/schemas/YoutubeChannelId"
14771
+ expiresInDays:
14772
+ default: 30
14773
+ description: Days until the link expires; at most 365.
14774
+ maximum: 365
14775
+ minimum: 1
14776
+ type: integer
14777
+ proof:
14778
+ $ref: "#/components/schemas/CreatorClaimProofKind"
14779
+ replace:
14780
+ default: false
14781
+ description: Set to revoke the site's OPEN claim and issue this one in its place. Without it, an OPEN claim answers `409 INVALID_SOURCE_STATE`.
14782
+ type: boolean
14783
+ required:
14784
+ - proof
14785
+ type: object
14786
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsResponse:
14787
+ $ref: "#/components/schemas/HandoverClaim"
14675
14788
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverRequest:
14676
14789
  additionalProperties: false
14677
14790
  properties:
@@ -15645,7 +15758,7 @@ components:
15645
15758
  additionalProperties: false
15646
15759
  properties:
15647
15760
  claimUrl:
15648
- description: "Present only in the response that issued the claim link, or re-issued it while the claim is still OPEN. Save it then: it is never shown again."
15761
+ description: Present only in the response that issued the claim link, or re-issued it while the claim is still OPEN. While the claim is OPEN the site owner can read the link again from `GET .../handover-claims`; once it is VERIFIED or CLAIMED it is gone.
15649
15762
  format: uri
15650
15763
  maxLength: 2048
15651
15764
  pattern: ^https://[^\s]+$
@@ -20006,7 +20119,7 @@ paths:
20006
20119
  /v2/claims/{token}:
20007
20120
  get:
20008
20121
  description: |
20009
- Needs a signed-in session; signed out is `401 AUTHENTICATION_REQUIRED` and reveals nothing. Returns the channel and site the link offers and the ways to prove the channel is the caller's. `404 CLAIM_NOT_FOUND` for an unknown or revoked link, `410 CLAIM_EXPIRED` once the demo is past its archive date. Rate limited per caller (`429 RATE_LIMITED`).
20122
+ Needs a signed-in session; signed out is `401 AUTHENTICATION_REQUIRED` and reveals nothing. Returns the site the link offers, what the claimant must show (`proof`) and the ways to show it. For `proof.kind` `YOUTUBE_CHANNEL` the response carries the `channel` and the `methods` that prove it is the caller's. For `LINK_ONLY` there is no channel and `methods` is empty: the caller goes straight to `POST /v2/claims/{token}:accept` after signing in. A response without `proof` is a `YOUTUBE_CHANNEL` claim. `organizationId` and `publicationId` are also returned to the person who issued the link (the site owner reading their own link), who owns the site; accepting it is refused with `409 INVALID_SOURCE_STATE`. `404 CLAIM_NOT_FOUND` for an unknown or revoked link, `410 CLAIM_EXPIRED` once the claim is past its expiry (a demo site's archive date, or the `expiresAt` the site owner chose). Rate limited per caller (`429 RATE_LIMITED`).
20010
20123
  operationId: getClaimsByToken
20011
20124
  parameters:
20012
20125
  - $ref: "#/components/parameters/XCorrelationId"
@@ -20035,6 +20148,10 @@ paths:
20035
20148
  methods:
20036
20149
  - GOOGLE
20037
20150
  - DESCRIPTION_CODE
20151
+ proof:
20152
+ channelId: UCabcdefghijklmnopqrstuv
20153
+ handle: "@mayacooks"
20154
+ kind: YOUTUBE_CHANNEL
20038
20155
  site:
20039
20156
  name: Maya Cooks
20040
20157
  url: https://rathnasdemo.github.io/maya-cooks/
@@ -20242,7 +20359,7 @@ paths:
20242
20359
  /v2/claims/{token}/description-code:
20243
20360
  post:
20244
20361
  description: |
20245
- Needs a signed-in session. Issues a one-time code to put in the YouTube channel description, valid 24 hours; a new request replaces an unexpired code issued to the same person. `404 CLAIM_NOT_FOUND`, `410 CLAIM_EXPIRED`, `409 CLAIM_ALREADY_CLAIMED`, and `409 CLAIM_CODE_PENDING` when a description code issued to another person for this claim is still pending: it expires at the time in the problem detail, so verify with Google instead, or try again after it expires. Rate limited (`429 RATE_LIMITED`).
20362
+ Needs a signed-in session. Issues a one-time code to put in the YouTube channel description, valid 24 hours; a new request replaces an unexpired code issued to the same person. `404 CLAIM_NOT_FOUND`, `410 CLAIM_EXPIRED`, `409 CLAIM_ALREADY_CLAIMED`, and `409 CLAIM_CODE_PENDING` when a description code issued to another person for this claim is still pending: it expires at the time in the problem detail, so verify with Google instead, or try again after it expires. A `LINK_ONLY` claim has no channel to prove, so this answers `400 VALIDATION_FAILED` for one. Rate limited (`429 RATE_LIMITED`). The first person to complete acceptance owns the site. Until a claim is `CLAIMED`, anyone who proves the channel may verify it, and a later proof replaces an earlier one.
20246
20363
  operationId: postClaimsByTokenDescriptionCode
20247
20364
  parameters:
20248
20365
  - $ref: "#/components/parameters/XCorrelationId"
@@ -20513,7 +20630,7 @@ paths:
20513
20630
  /v2/claims/{token}/description-code:check:
20514
20631
  post:
20515
20632
  description: |
20516
- Needs a signed-in session. Reads the channel description through the YouTube Data API and, when it contains the issued code, marks the claim verified for this person and spends the code. A code that is not there yet is `200` with `verified: false` and a `reason`, not a problem. `503 DEPENDENCY_UNAVAILABLE` when YouTube cannot be reached. Rate limited (`429 RATE_LIMITED`).
20633
+ Needs a signed-in session. Reads the channel description through the YouTube Data API and, when it contains the issued code, marks the claim verified for this person and spends the code. A code that is not there yet is `200` with `verified: false` and a `reason`, not a problem. `503 DEPENDENCY_UNAVAILABLE` when YouTube cannot be reached. A `LINK_ONLY` claim has no channel to prove, so this answers `400 VALIDATION_FAILED` for one. Rate limited (`429 RATE_LIMITED`). The first person to complete acceptance owns the site. Until a claim is `CLAIMED`, anyone who proves the channel may verify it, and a later proof replaces an earlier one.
20517
20634
  operationId: postClaimsByTokenDescriptionCodeCheck
20518
20635
  parameters:
20519
20636
  - $ref: "#/components/parameters/XCorrelationId"
@@ -20797,7 +20914,7 @@ paths:
20797
20914
  /v2/claims/{token}/google:start:
20798
20915
  post:
20799
20916
  description: |
20800
- Needs a signed-in session. Returns the Google authorize URL for one single-use, PKCE-protected transaction bound to this session; the callback is `GET /v2/callbacks/google/claim`. `404 CLAIM_NOT_FOUND`, `410 CLAIM_EXPIRED`, `409 CLAIM_ALREADY_CLAIMED` when the site was taken. Rate limited (`429 RATE_LIMITED`).
20917
+ Needs a signed-in session. Returns the Google authorize URL for one single-use, PKCE-protected transaction bound to this session; the callback is `GET /v2/callbacks/google/claim`. `404 CLAIM_NOT_FOUND`, `410 CLAIM_EXPIRED`, `409 CLAIM_ALREADY_CLAIMED` when the site was taken. A `LINK_ONLY` claim has no channel to prove, so this answers `400 VALIDATION_FAILED` for one. Rate limited (`429 RATE_LIMITED`). The first person to complete acceptance owns the site. Until a claim is `CLAIMED`, anyone who proves the channel may verify it, and a later proof replaces an earlier one.
20801
20918
  operationId: postClaimsByTokenGoogleStart
20802
20919
  parameters:
20803
20920
  - $ref: "#/components/parameters/XCorrelationId"
@@ -21052,7 +21169,7 @@ paths:
21052
21169
  /v2/claims/{token}:accept:
21053
21170
  post:
21054
21171
  description: |
21055
- Needs recent authentication. Requires the claim to be verified by this same person (`409 CLAIM_NOT_VERIFIED` otherwise), then makes the caller the owner of the demo organisation. Repeating the call after success returns the same organisation. `409 CLAIM_ALREADY_CLAIMED` when another person claimed it; `410 CLAIM_EXPIRED`. An API key is always refused.
21172
+ Needs recent authentication. For a `YOUTUBE_CHANNEL` claim it requires the claim to be verified by this same person (`409 CLAIM_NOT_VERIFIED` otherwise); a `LINK_ONLY` claim has nothing to verify and is accepted from `OPEN`. Then it makes the caller the owner of the site's organisation, which hands the site over. Repeating the call after success returns the same organisation. `409 INVALID_SOURCE_STATE` when the caller is the person who issued the claim or already owns the site: nobody can claim their own site. `409 CLAIM_ALREADY_CLAIMED` when another person claimed it; `410 CLAIM_EXPIRED`. An API key is always refused. The first person to complete acceptance owns the site. Until a claim is `CLAIMED`, anyone who proves the channel may verify it, and a later proof replaces an earlier one.
21056
21173
  operationId: postClaimsByTokenAccept
21057
21174
  parameters:
21058
21175
  - $ref: "#/components/parameters/XCorrelationId"
@@ -21237,9 +21354,22 @@ paths:
21237
21354
  status: 409
21238
21355
  title: CLAIM_NOT_VERIFIED
21239
21356
  type: urn:gala:problem:claim-not-verified
21357
+ INVALID_SOURCE_STATE:
21358
+ summary: INVALID_SOURCE_STATE
21359
+ value:
21360
+ code: INVALID_SOURCE_STATE
21361
+ correlationId: 018f0000-0000-7000-8000-000000000001
21362
+ detail: See the operation contract.
21363
+ errors: []
21364
+ retryable: false
21365
+ schemaId: urn:gala:schema:problem:2.0.0
21366
+ schemaVersion: 2.0.0
21367
+ status: 409
21368
+ title: INVALID_SOURCE_STATE
21369
+ type: urn:gala:problem:invalid-source-state
21240
21370
  schema:
21241
21371
  $ref: "#/components/schemas/Problem"
21242
- description: CLAIM_ALREADY_CLAIMED, CLAIM_NOT_VERIFIED
21372
+ description: CLAIM_ALREADY_CLAIMED, CLAIM_NOT_VERIFIED, INVALID_SOURCE_STATE
21243
21373
  headers:
21244
21374
  Cache-Control:
21245
21375
  $ref: "#/components/headers/CacheControlNoStore"
@@ -21248,6 +21378,7 @@ paths:
21248
21378
  x-gala-problem-codes:
21249
21379
  - CLAIM_ALREADY_CLAIMED
21250
21380
  - CLAIM_NOT_VERIFIED
21381
+ - INVALID_SOURCE_STATE
21251
21382
  "410":
21252
21383
  content:
21253
21384
  application/problem+json:
@@ -21327,12 +21458,14 @@ paths:
21327
21458
  - CLAIM_EXPIRED
21328
21459
  - CLAIM_NOT_FOUND
21329
21460
  - CLAIM_NOT_VERIFIED
21461
+ - INVALID_SOURCE_STATE
21330
21462
  - RATE_LIMITED
21331
21463
  - REAUTH_REQUIRED
21332
21464
  - VALIDATION_FAILED
21333
21465
  x-gala-replay-identity: natural-idempotent-state
21334
21466
  x-gala-state-guards:
21335
- - NONE
21467
+ - CreatorClaim:OPEN -> CLAIMED
21468
+ - CreatorClaim:VERIFIED -> CLAIMED
21336
21469
  x-gala-success-category: protocol
21337
21470
  x-gala-tenant-scope: NONE
21338
21471
  /v2/github/app:
@@ -38402,21 +38535,747 @@ paths:
38402
38535
  - RESOURCE_NOT_FOUND
38403
38536
  security:
38404
38537
  - browserSession: []
38405
- summary: read the Prism generation policy
38538
+ summary: read the Prism generation policy
38539
+ tags:
38540
+ - prism
38541
+ x-gala-activation-gate: MVP
38542
+ x-gala-activation-guards:
38543
+ - NONE
38544
+ x-gala-capability-key: publication.source.write
38545
+ x-gala-concurrency: authorization-and-publication-epochs
38546
+ x-gala-conditional-capabilities: []
38547
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
38548
+ x-gala-nullability: required-and-nullable-are-explicit
38549
+ x-gala-purpose: read the Prism generation policy
38550
+ x-gala-reachable-problems:
38551
+ - AUTHENTICATION_REQUIRED
38552
+ - AUTHORIZATION_DENIED
38553
+ - RESOURCE_NOT_FOUND
38554
+ - VALIDATION_FAILED
38555
+ x-gala-replay-identity: safe-query
38556
+ x-gala-state-guards:
38557
+ - NONE
38558
+ x-gala-success-category: query
38559
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
38560
+ /v2/organizations/{organizationId}/publications/{publicationId}/handover:
38561
+ get:
38562
+ description: |
38563
+ The organisation owner, signed in (a read needs no fresh sign-in); an API key is always refused. Reports the handover of a demo site into the creator's own GitHub account: its state, the target, whether the Galascribe App is installed on the target, each step and the address the site will have. `200` with `state: NOT_STARTED` (empty `steps`, `version` 0, no `target`, `appInstalledOnTarget` or `siteUrlAfter`) for a demo publication (one with a demo-site record) that has no handover yet; `200` with the latest handover otherwise, including `DONE`, `FAILED` and `CANCELLED`; `404 RESOURCE_NOT_FOUND` only for a publication that is not a demo publication.
38564
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdHandover
38565
+ parameters:
38566
+ - $ref: "#/components/parameters/XCorrelationId"
38567
+ - example: 018f0000-0000-7000-8000-000000000001
38568
+ in: path
38569
+ name: organizationId
38570
+ required: true
38571
+ schema:
38572
+ format: uuid
38573
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38574
+ type: string
38575
+ - example: 018f0000-0000-7000-8000-000000000001
38576
+ in: path
38577
+ name: publicationId
38578
+ required: true
38579
+ schema:
38580
+ format: uuid
38581
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38582
+ type: string
38583
+ responses:
38584
+ "200":
38585
+ content:
38586
+ application/json:
38587
+ examples:
38588
+ nominal:
38589
+ summary: Nominal successful response
38590
+ value:
38591
+ appInstalledOnTarget: true
38592
+ siteUrlAfter: https://creator-org.github.io/maya-cooks/
38593
+ state: TRANSFER_STARTED
38594
+ steps:
38595
+ - name: FINALIZE_CHANGE
38596
+ state: DONE
38597
+ - name: TRANSFER
38598
+ state: RUNNING
38599
+ - name: RELINK
38600
+ state: PENDING
38601
+ - name: PAGES
38602
+ state: PENDING
38603
+ - name: PUBLISH
38604
+ state: PENDING
38605
+ target:
38606
+ kind: ORGANIZATION
38607
+ ownerLogin: creator-org
38608
+ version: 1
38609
+ notStarted:
38610
+ summary: Demo publication with no handover yet
38611
+ value:
38612
+ state: NOT_STARTED
38613
+ steps: []
38614
+ version: 0
38615
+ schema:
38616
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverResponse"
38617
+ description: read publication handover succeeded
38618
+ headers:
38619
+ Cache-Control:
38620
+ $ref: "#/components/headers/CacheControlNoStore"
38621
+ X-Correlation-Id:
38622
+ $ref: "#/components/headers/XCorrelationId"
38623
+ "400":
38624
+ content:
38625
+ application/problem+json:
38626
+ examples:
38627
+ VALIDATION_FAILED:
38628
+ summary: VALIDATION_FAILED
38629
+ value:
38630
+ code: VALIDATION_FAILED
38631
+ correlationId: 018f0000-0000-7000-8000-000000000001
38632
+ detail: See the operation contract.
38633
+ errors: []
38634
+ retryable: false
38635
+ schemaId: urn:gala:schema:problem:2.0.0
38636
+ schemaVersion: 2.0.0
38637
+ status: 400
38638
+ title: VALIDATION_FAILED
38639
+ type: urn:gala:problem:validation-failed
38640
+ schema:
38641
+ $ref: "#/components/schemas/Problem"
38642
+ description: VALIDATION_FAILED
38643
+ headers:
38644
+ Cache-Control:
38645
+ $ref: "#/components/headers/CacheControlNoStore"
38646
+ X-Correlation-Id:
38647
+ $ref: "#/components/headers/XCorrelationId"
38648
+ x-gala-problem-codes:
38649
+ - VALIDATION_FAILED
38650
+ "401":
38651
+ content:
38652
+ application/problem+json:
38653
+ examples:
38654
+ AUTHENTICATION_REQUIRED:
38655
+ summary: AUTHENTICATION_REQUIRED
38656
+ value:
38657
+ code: AUTHENTICATION_REQUIRED
38658
+ correlationId: 018f0000-0000-7000-8000-000000000001
38659
+ detail: See the operation contract.
38660
+ errors: []
38661
+ retryable: false
38662
+ schemaId: urn:gala:schema:problem:2.0.0
38663
+ schemaVersion: 2.0.0
38664
+ status: 401
38665
+ title: AUTHENTICATION_REQUIRED
38666
+ type: urn:gala:problem:authentication-required
38667
+ schema:
38668
+ $ref: "#/components/schemas/Problem"
38669
+ description: AUTHENTICATION_REQUIRED
38670
+ headers:
38671
+ Cache-Control:
38672
+ $ref: "#/components/headers/CacheControlNoStore"
38673
+ X-Correlation-Id:
38674
+ $ref: "#/components/headers/XCorrelationId"
38675
+ x-gala-problem-codes:
38676
+ - AUTHENTICATION_REQUIRED
38677
+ "403":
38678
+ content:
38679
+ application/problem+json:
38680
+ examples:
38681
+ AUTHORIZATION_DENIED:
38682
+ summary: AUTHORIZATION_DENIED
38683
+ value:
38684
+ code: AUTHORIZATION_DENIED
38685
+ correlationId: 018f0000-0000-7000-8000-000000000001
38686
+ detail: See the operation contract.
38687
+ errors: []
38688
+ retryable: false
38689
+ schemaId: urn:gala:schema:problem:2.0.0
38690
+ schemaVersion: 2.0.0
38691
+ status: 403
38692
+ title: AUTHORIZATION_DENIED
38693
+ type: urn:gala:problem:authorization-denied
38694
+ schema:
38695
+ $ref: "#/components/schemas/Problem"
38696
+ description: AUTHORIZATION_DENIED
38697
+ headers:
38698
+ Cache-Control:
38699
+ $ref: "#/components/headers/CacheControlNoStore"
38700
+ X-Correlation-Id:
38701
+ $ref: "#/components/headers/XCorrelationId"
38702
+ x-gala-problem-codes:
38703
+ - AUTHORIZATION_DENIED
38704
+ "404":
38705
+ content:
38706
+ application/problem+json:
38707
+ examples:
38708
+ RESOURCE_NOT_FOUND:
38709
+ summary: RESOURCE_NOT_FOUND
38710
+ value:
38711
+ code: RESOURCE_NOT_FOUND
38712
+ correlationId: 018f0000-0000-7000-8000-000000000001
38713
+ detail: See the operation contract.
38714
+ errors: []
38715
+ retryable: false
38716
+ schemaId: urn:gala:schema:problem:2.0.0
38717
+ schemaVersion: 2.0.0
38718
+ status: 404
38719
+ title: RESOURCE_NOT_FOUND
38720
+ type: urn:gala:problem:resource-not-found
38721
+ schema:
38722
+ $ref: "#/components/schemas/Problem"
38723
+ description: RESOURCE_NOT_FOUND
38724
+ headers:
38725
+ Cache-Control:
38726
+ $ref: "#/components/headers/CacheControlNoStore"
38727
+ X-Correlation-Id:
38728
+ $ref: "#/components/headers/XCorrelationId"
38729
+ x-gala-problem-codes:
38730
+ - RESOURCE_NOT_FOUND
38731
+ security:
38732
+ - browserSession: []
38733
+ summary: read publication handover
38734
+ tags:
38735
+ - organizations
38736
+ x-gala-action-grant: none
38737
+ x-gala-activation-gate: MVP
38738
+ x-gala-activation-guards:
38739
+ - NONE
38740
+ x-gala-assurance-class: SESSION
38741
+ x-gala-capability-key: publication.handover.view
38742
+ x-gala-concurrency: none
38743
+ x-gala-conditional-capabilities: []
38744
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
38745
+ x-gala-nullability: required-and-nullable-are-explicit
38746
+ x-gala-purpose: read publication handover
38747
+ x-gala-reachable-problems:
38748
+ - AUTHENTICATION_REQUIRED
38749
+ - AUTHORIZATION_DENIED
38750
+ - RESOURCE_NOT_FOUND
38751
+ - VALIDATION_FAILED
38752
+ x-gala-replay-identity: safe-query
38753
+ x-gala-state-guards:
38754
+ - NONE
38755
+ x-gala-success-category: query
38756
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
38757
+ post:
38758
+ description: |
38759
+ The organisation owner, with recent authentication; an API key is always refused. Moves a demo site's repository into `targetOwnerLogin` (a person or an organisation where the Galascribe App is installed): plans and confirms the finalize change in the caller's session, then starts the GitHub transfer. `202` accepts; `GET` reports progress. `409 HANDOVER_EXISTS` while one is live, `409 HANDOVER_TARGET_NOT_INSTALLED` when the App is not installed on the target, `503 DEPENDENCY_UNAVAILABLE` when GitHub cannot be reached. `404 RESOURCE_NOT_FOUND` when the publication is not a demo site. The response never carries `state: NOT_STARTED`.
38760
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdHandover
38761
+ parameters:
38762
+ - $ref: "#/components/parameters/XCorrelationId"
38763
+ - example: 018f0000-0000-7000-8000-000000000001
38764
+ in: path
38765
+ name: organizationId
38766
+ required: true
38767
+ schema:
38768
+ format: uuid
38769
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38770
+ type: string
38771
+ - example: 018f0000-0000-7000-8000-000000000001
38772
+ in: path
38773
+ name: publicationId
38774
+ required: true
38775
+ schema:
38776
+ format: uuid
38777
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38778
+ type: string
38779
+ - $ref: "#/components/parameters/IdempotencyKey"
38780
+ - $ref: "#/components/parameters/XCsrfToken"
38781
+ requestBody:
38782
+ content:
38783
+ application/json:
38784
+ examples:
38785
+ nominal:
38786
+ summary: Nominal valid request
38787
+ value:
38788
+ targetOwnerLogin: creator-org
38789
+ schema:
38790
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverRequest"
38791
+ required: true
38792
+ responses:
38793
+ "202":
38794
+ content:
38795
+ application/json:
38796
+ examples:
38797
+ nominal:
38798
+ summary: Nominal successful response
38799
+ value:
38800
+ appInstalledOnTarget: true
38801
+ siteUrlAfter: https://creator-org.github.io/maya-cooks/
38802
+ state: REQUESTED
38803
+ steps:
38804
+ - name: FINALIZE_CHANGE
38805
+ state: DONE
38806
+ - name: TRANSFER
38807
+ state: RUNNING
38808
+ - name: RELINK
38809
+ state: PENDING
38810
+ - name: PAGES
38811
+ state: PENDING
38812
+ - name: PUBLISH
38813
+ state: PENDING
38814
+ target:
38815
+ kind: ORGANIZATION
38816
+ ownerLogin: creator-org
38817
+ version: 1
38818
+ schema:
38819
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverResponse"
38820
+ description: start publication handover succeeded
38821
+ headers:
38822
+ Cache-Control:
38823
+ $ref: "#/components/headers/CacheControlNoStore"
38824
+ X-Correlation-Id:
38825
+ $ref: "#/components/headers/XCorrelationId"
38826
+ "400":
38827
+ content:
38828
+ application/problem+json:
38829
+ examples:
38830
+ REQUEST_FIELD_UNKNOWN:
38831
+ summary: REQUEST_FIELD_UNKNOWN
38832
+ value:
38833
+ code: REQUEST_FIELD_UNKNOWN
38834
+ correlationId: 018f0000-0000-7000-8000-000000000001
38835
+ detail: See the operation contract.
38836
+ errors: []
38837
+ retryable: false
38838
+ schemaId: urn:gala:schema:problem:2.0.0
38839
+ schemaVersion: 2.0.0
38840
+ status: 400
38841
+ title: REQUEST_FIELD_UNKNOWN
38842
+ type: urn:gala:problem:request-field-unknown
38843
+ VALIDATION_FAILED:
38844
+ summary: VALIDATION_FAILED
38845
+ value:
38846
+ code: VALIDATION_FAILED
38847
+ correlationId: 018f0000-0000-7000-8000-000000000001
38848
+ detail: See the operation contract.
38849
+ errors: []
38850
+ retryable: false
38851
+ schemaId: urn:gala:schema:problem:2.0.0
38852
+ schemaVersion: 2.0.0
38853
+ status: 400
38854
+ title: VALIDATION_FAILED
38855
+ type: urn:gala:problem:validation-failed
38856
+ schema:
38857
+ $ref: "#/components/schemas/Problem"
38858
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
38859
+ headers:
38860
+ Cache-Control:
38861
+ $ref: "#/components/headers/CacheControlNoStore"
38862
+ X-Correlation-Id:
38863
+ $ref: "#/components/headers/XCorrelationId"
38864
+ x-gala-problem-codes:
38865
+ - REQUEST_FIELD_UNKNOWN
38866
+ - VALIDATION_FAILED
38867
+ "401":
38868
+ content:
38869
+ application/problem+json:
38870
+ examples:
38871
+ AUTHENTICATION_REQUIRED:
38872
+ summary: AUTHENTICATION_REQUIRED
38873
+ value:
38874
+ code: AUTHENTICATION_REQUIRED
38875
+ correlationId: 018f0000-0000-7000-8000-000000000001
38876
+ detail: See the operation contract.
38877
+ errors: []
38878
+ retryable: false
38879
+ schemaId: urn:gala:schema:problem:2.0.0
38880
+ schemaVersion: 2.0.0
38881
+ status: 401
38882
+ title: AUTHENTICATION_REQUIRED
38883
+ type: urn:gala:problem:authentication-required
38884
+ REAUTH_REQUIRED:
38885
+ summary: REAUTH_REQUIRED
38886
+ value:
38887
+ code: REAUTH_REQUIRED
38888
+ correlationId: 018f0000-0000-7000-8000-000000000001
38889
+ detail: See the operation contract.
38890
+ errors: []
38891
+ retryable: false
38892
+ schemaId: urn:gala:schema:problem:2.0.0
38893
+ schemaVersion: 2.0.0
38894
+ status: 401
38895
+ title: REAUTH_REQUIRED
38896
+ type: urn:gala:problem:reauth-required
38897
+ schema:
38898
+ $ref: "#/components/schemas/Problem"
38899
+ description: AUTHENTICATION_REQUIRED, REAUTH_REQUIRED
38900
+ headers:
38901
+ Cache-Control:
38902
+ $ref: "#/components/headers/CacheControlNoStore"
38903
+ X-Correlation-Id:
38904
+ $ref: "#/components/headers/XCorrelationId"
38905
+ x-gala-problem-codes:
38906
+ - AUTHENTICATION_REQUIRED
38907
+ - REAUTH_REQUIRED
38908
+ "403":
38909
+ content:
38910
+ application/problem+json:
38911
+ examples:
38912
+ AUTHORIZATION_DENIED:
38913
+ summary: AUTHORIZATION_DENIED
38914
+ value:
38915
+ code: AUTHORIZATION_DENIED
38916
+ correlationId: 018f0000-0000-7000-8000-000000000001
38917
+ detail: See the operation contract.
38918
+ errors: []
38919
+ retryable: false
38920
+ schemaId: urn:gala:schema:problem:2.0.0
38921
+ schemaVersion: 2.0.0
38922
+ status: 403
38923
+ title: AUTHORIZATION_DENIED
38924
+ type: urn:gala:problem:authorization-denied
38925
+ schema:
38926
+ $ref: "#/components/schemas/Problem"
38927
+ description: AUTHORIZATION_DENIED
38928
+ headers:
38929
+ Cache-Control:
38930
+ $ref: "#/components/headers/CacheControlNoStore"
38931
+ X-Correlation-Id:
38932
+ $ref: "#/components/headers/XCorrelationId"
38933
+ x-gala-problem-codes:
38934
+ - AUTHORIZATION_DENIED
38935
+ "404":
38936
+ content:
38937
+ application/problem+json:
38938
+ examples:
38939
+ RESOURCE_NOT_FOUND:
38940
+ summary: RESOURCE_NOT_FOUND
38941
+ value:
38942
+ code: RESOURCE_NOT_FOUND
38943
+ correlationId: 018f0000-0000-7000-8000-000000000001
38944
+ detail: See the operation contract.
38945
+ errors: []
38946
+ retryable: false
38947
+ schemaId: urn:gala:schema:problem:2.0.0
38948
+ schemaVersion: 2.0.0
38949
+ status: 404
38950
+ title: RESOURCE_NOT_FOUND
38951
+ type: urn:gala:problem:resource-not-found
38952
+ schema:
38953
+ $ref: "#/components/schemas/Problem"
38954
+ description: RESOURCE_NOT_FOUND
38955
+ headers:
38956
+ Cache-Control:
38957
+ $ref: "#/components/headers/CacheControlNoStore"
38958
+ X-Correlation-Id:
38959
+ $ref: "#/components/headers/XCorrelationId"
38960
+ x-gala-problem-codes:
38961
+ - RESOURCE_NOT_FOUND
38962
+ "409":
38963
+ content:
38964
+ application/problem+json:
38965
+ examples:
38966
+ COMMAND_REPLAY_CONFLICT:
38967
+ summary: COMMAND_REPLAY_CONFLICT
38968
+ value:
38969
+ code: COMMAND_REPLAY_CONFLICT
38970
+ correlationId: 018f0000-0000-7000-8000-000000000001
38971
+ detail: See the operation contract.
38972
+ errors: []
38973
+ retryable: false
38974
+ schemaId: urn:gala:schema:problem:2.0.0
38975
+ schemaVersion: 2.0.0
38976
+ status: 409
38977
+ title: COMMAND_REPLAY_CONFLICT
38978
+ type: urn:gala:problem:command-replay-conflict
38979
+ HANDOVER_EXISTS:
38980
+ summary: HANDOVER_EXISTS
38981
+ value:
38982
+ code: HANDOVER_EXISTS
38983
+ correlationId: 018f0000-0000-7000-8000-000000000001
38984
+ detail: See the operation contract.
38985
+ errors: []
38986
+ retryable: false
38987
+ schemaId: urn:gala:schema:problem:2.0.0
38988
+ schemaVersion: 2.0.0
38989
+ status: 409
38990
+ title: HANDOVER_EXISTS
38991
+ type: urn:gala:problem:handover-exists
38992
+ HANDOVER_TARGET_NOT_INSTALLED:
38993
+ summary: HANDOVER_TARGET_NOT_INSTALLED
38994
+ value:
38995
+ code: HANDOVER_TARGET_NOT_INSTALLED
38996
+ correlationId: 018f0000-0000-7000-8000-000000000001
38997
+ detail: See the operation contract.
38998
+ errors: []
38999
+ retryable: false
39000
+ schemaId: urn:gala:schema:problem:2.0.0
39001
+ schemaVersion: 2.0.0
39002
+ status: 409
39003
+ title: HANDOVER_TARGET_NOT_INSTALLED
39004
+ type: urn:gala:problem:handover-target-not-installed
39005
+ schema:
39006
+ $ref: "#/components/schemas/Problem"
39007
+ description: COMMAND_REPLAY_CONFLICT, HANDOVER_EXISTS, HANDOVER_TARGET_NOT_INSTALLED
39008
+ headers:
39009
+ Cache-Control:
39010
+ $ref: "#/components/headers/CacheControlNoStore"
39011
+ X-Correlation-Id:
39012
+ $ref: "#/components/headers/XCorrelationId"
39013
+ x-gala-problem-codes:
39014
+ - COMMAND_REPLAY_CONFLICT
39015
+ - HANDOVER_EXISTS
39016
+ - HANDOVER_TARGET_NOT_INSTALLED
39017
+ "503":
39018
+ content:
39019
+ application/problem+json:
39020
+ examples:
39021
+ DEPENDENCY_UNAVAILABLE:
39022
+ summary: DEPENDENCY_UNAVAILABLE
39023
+ value:
39024
+ code: DEPENDENCY_UNAVAILABLE
39025
+ correlationId: 018f0000-0000-7000-8000-000000000001
39026
+ detail: See the operation contract.
39027
+ errors: []
39028
+ retryable: true
39029
+ schemaId: urn:gala:schema:problem:2.0.0
39030
+ schemaVersion: 2.0.0
39031
+ status: 503
39032
+ title: DEPENDENCY_UNAVAILABLE
39033
+ type: urn:gala:problem:dependency-unavailable
39034
+ schema:
39035
+ $ref: "#/components/schemas/Problem"
39036
+ description: DEPENDENCY_UNAVAILABLE
39037
+ headers:
39038
+ Cache-Control:
39039
+ $ref: "#/components/headers/CacheControlNoStore"
39040
+ X-Correlation-Id:
39041
+ $ref: "#/components/headers/XCorrelationId"
39042
+ x-gala-problem-codes:
39043
+ - DEPENDENCY_UNAVAILABLE
39044
+ security:
39045
+ - browserSession: []
39046
+ summary: start publication handover
39047
+ tags:
39048
+ - organizations
39049
+ x-gala-action-grant: none
39050
+ x-gala-activation-gate: MVP
39051
+ x-gala-activation-guards:
39052
+ - NONE
39053
+ x-gala-assurance-class: RECENT_AUTHENTICATION
39054
+ x-gala-capability-key: publication.handover.manage
39055
+ x-gala-concurrency: none
39056
+ x-gala-conditional-capabilities: []
39057
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
39058
+ x-gala-nullability: required-and-nullable-are-explicit
39059
+ x-gala-purpose: start publication handover
39060
+ x-gala-reachable-problems:
39061
+ - AUTHENTICATION_REQUIRED
39062
+ - AUTHORIZATION_DENIED
39063
+ - COMMAND_REPLAY_CONFLICT
39064
+ - DEPENDENCY_UNAVAILABLE
39065
+ - HANDOVER_EXISTS
39066
+ - HANDOVER_TARGET_NOT_INSTALLED
39067
+ - REAUTH_REQUIRED
39068
+ - REQUEST_FIELD_UNKNOWN
39069
+ - RESOURCE_NOT_FOUND
39070
+ - VALIDATION_FAILED
39071
+ x-gala-replay-identity: idempotency-key
39072
+ x-gala-state-guards:
39073
+ - NONE
39074
+ x-gala-success-category: async
39075
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
39076
+ /v2/organizations/{organizationId}/publications/{publicationId}/handover-claims:
39077
+ get:
39078
+ description: |
39079
+ The organisation owner, with recent authentication; an API key is always refused. Lists the claim links that hand this site to whoever accepts them, newest first and in every state (`OPEN`, `VERIFIED`, `CLAIMED`, `EXPIRED`, `REVOKED`), at most the 50 most recent. `claimUrl` is present only on an `OPEN` claim whose token the API holds sealed, so the owner can copy it again; it is a bearer secret and is never returned for any other state. A claim issued before 3.14.0 may have no `claimUrl` until the owner re-issues it with `replace`. `claimedBy` is present only on a `CLAIMED` claim. A claim past `expiresAt` reads `EXPIRED`. Demo sites are owned by the operator's organisation until claimed, so the operator finds a demo site's claim link here, in that site's Settings. `404 RESOURCE_NOT_FOUND` for a publication that is not in the organisation.
39080
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaims
39081
+ parameters:
39082
+ - $ref: "#/components/parameters/XCorrelationId"
39083
+ - example: 018f0000-0000-7000-8000-000000000001
39084
+ in: path
39085
+ name: organizationId
39086
+ required: true
39087
+ schema:
39088
+ format: uuid
39089
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
39090
+ type: string
39091
+ - example: 018f0000-0000-7000-8000-000000000001
39092
+ in: path
39093
+ name: publicationId
39094
+ required: true
39095
+ schema:
39096
+ format: uuid
39097
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
39098
+ type: string
39099
+ responses:
39100
+ "200":
39101
+ content:
39102
+ application/json:
39103
+ examples:
39104
+ nominal:
39105
+ summary: Nominal successful response
39106
+ value:
39107
+ items:
39108
+ - claimId: 018f0000-0000-7000-8000-000000000001
39109
+ claimUrl: https://app.galascribe.com/claim/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ
39110
+ createdAt: "2026-10-17T12:00:00.000Z"
39111
+ expiresAt: "2026-11-16T12:00:00.000Z"
39112
+ proof:
39113
+ kind: LINK_ONLY
39114
+ state: OPEN
39115
+ version: 0
39116
+ - claimId: 018f0000-0000-7000-8000-000000000002
39117
+ claimedAt: "2026-10-20T09:30:00.000Z"
39118
+ claimedBy:
39119
+ displayName: Maya Cooks
39120
+ login: mayacooks
39121
+ createdAt: "2026-10-15T12:00:00.000Z"
39122
+ expiresAt: "2026-11-14T12:00:00.000Z"
39123
+ proof:
39124
+ channelId: UCabcdefghijklmnopqrstuv
39125
+ handle: "@mayacooks"
39126
+ kind: YOUTUBE_CHANNEL
39127
+ state: CLAIMED
39128
+ version: 2
39129
+ schema:
39130
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsResponse"
39131
+ description: list site handover claims succeeded
39132
+ headers:
39133
+ Cache-Control:
39134
+ $ref: "#/components/headers/CacheControlNoStore"
39135
+ X-Correlation-Id:
39136
+ $ref: "#/components/headers/XCorrelationId"
39137
+ "400":
39138
+ content:
39139
+ application/problem+json:
39140
+ examples:
39141
+ VALIDATION_FAILED:
39142
+ summary: VALIDATION_FAILED
39143
+ value:
39144
+ code: VALIDATION_FAILED
39145
+ correlationId: 018f0000-0000-7000-8000-000000000001
39146
+ detail: See the operation contract.
39147
+ errors: []
39148
+ retryable: false
39149
+ schemaId: urn:gala:schema:problem:2.0.0
39150
+ schemaVersion: 2.0.0
39151
+ status: 400
39152
+ title: VALIDATION_FAILED
39153
+ type: urn:gala:problem:validation-failed
39154
+ schema:
39155
+ $ref: "#/components/schemas/Problem"
39156
+ description: VALIDATION_FAILED
39157
+ headers:
39158
+ Cache-Control:
39159
+ $ref: "#/components/headers/CacheControlNoStore"
39160
+ X-Correlation-Id:
39161
+ $ref: "#/components/headers/XCorrelationId"
39162
+ x-gala-problem-codes:
39163
+ - VALIDATION_FAILED
39164
+ "401":
39165
+ content:
39166
+ application/problem+json:
39167
+ examples:
39168
+ AUTHENTICATION_REQUIRED:
39169
+ summary: AUTHENTICATION_REQUIRED
39170
+ value:
39171
+ code: AUTHENTICATION_REQUIRED
39172
+ correlationId: 018f0000-0000-7000-8000-000000000001
39173
+ detail: See the operation contract.
39174
+ errors: []
39175
+ retryable: false
39176
+ schemaId: urn:gala:schema:problem:2.0.0
39177
+ schemaVersion: 2.0.0
39178
+ status: 401
39179
+ title: AUTHENTICATION_REQUIRED
39180
+ type: urn:gala:problem:authentication-required
39181
+ REAUTH_REQUIRED:
39182
+ summary: REAUTH_REQUIRED
39183
+ value:
39184
+ code: REAUTH_REQUIRED
39185
+ correlationId: 018f0000-0000-7000-8000-000000000001
39186
+ detail: See the operation contract.
39187
+ errors: []
39188
+ retryable: false
39189
+ schemaId: urn:gala:schema:problem:2.0.0
39190
+ schemaVersion: 2.0.0
39191
+ status: 401
39192
+ title: REAUTH_REQUIRED
39193
+ type: urn:gala:problem:reauth-required
39194
+ schema:
39195
+ $ref: "#/components/schemas/Problem"
39196
+ description: AUTHENTICATION_REQUIRED, REAUTH_REQUIRED
39197
+ headers:
39198
+ Cache-Control:
39199
+ $ref: "#/components/headers/CacheControlNoStore"
39200
+ X-Correlation-Id:
39201
+ $ref: "#/components/headers/XCorrelationId"
39202
+ x-gala-problem-codes:
39203
+ - AUTHENTICATION_REQUIRED
39204
+ - REAUTH_REQUIRED
39205
+ "403":
39206
+ content:
39207
+ application/problem+json:
39208
+ examples:
39209
+ AUTHORIZATION_DENIED:
39210
+ summary: AUTHORIZATION_DENIED
39211
+ value:
39212
+ code: AUTHORIZATION_DENIED
39213
+ correlationId: 018f0000-0000-7000-8000-000000000001
39214
+ detail: See the operation contract.
39215
+ errors: []
39216
+ retryable: false
39217
+ schemaId: urn:gala:schema:problem:2.0.0
39218
+ schemaVersion: 2.0.0
39219
+ status: 403
39220
+ title: AUTHORIZATION_DENIED
39221
+ type: urn:gala:problem:authorization-denied
39222
+ schema:
39223
+ $ref: "#/components/schemas/Problem"
39224
+ description: AUTHORIZATION_DENIED
39225
+ headers:
39226
+ Cache-Control:
39227
+ $ref: "#/components/headers/CacheControlNoStore"
39228
+ X-Correlation-Id:
39229
+ $ref: "#/components/headers/XCorrelationId"
39230
+ x-gala-problem-codes:
39231
+ - AUTHORIZATION_DENIED
39232
+ "404":
39233
+ content:
39234
+ application/problem+json:
39235
+ examples:
39236
+ RESOURCE_NOT_FOUND:
39237
+ summary: RESOURCE_NOT_FOUND
39238
+ value:
39239
+ code: RESOURCE_NOT_FOUND
39240
+ correlationId: 018f0000-0000-7000-8000-000000000001
39241
+ detail: See the operation contract.
39242
+ errors: []
39243
+ retryable: false
39244
+ schemaId: urn:gala:schema:problem:2.0.0
39245
+ schemaVersion: 2.0.0
39246
+ status: 404
39247
+ title: RESOURCE_NOT_FOUND
39248
+ type: urn:gala:problem:resource-not-found
39249
+ schema:
39250
+ $ref: "#/components/schemas/Problem"
39251
+ description: RESOURCE_NOT_FOUND
39252
+ headers:
39253
+ Cache-Control:
39254
+ $ref: "#/components/headers/CacheControlNoStore"
39255
+ X-Correlation-Id:
39256
+ $ref: "#/components/headers/XCorrelationId"
39257
+ x-gala-problem-codes:
39258
+ - RESOURCE_NOT_FOUND
39259
+ security:
39260
+ - browserSession: []
39261
+ summary: list site handover claims
38406
39262
  tags:
38407
- - prism
39263
+ - organizations
39264
+ x-gala-action-grant: none
38408
39265
  x-gala-activation-gate: MVP
38409
39266
  x-gala-activation-guards:
38410
39267
  - NONE
38411
- x-gala-capability-key: publication.source.write
38412
- x-gala-concurrency: authorization-and-publication-epochs
39268
+ x-gala-assurance-class: RECENT_AUTHENTICATION
39269
+ x-gala-capability-key: publication.handover.manage
39270
+ x-gala-concurrency: none
38413
39271
  x-gala-conditional-capabilities: []
38414
39272
  x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
38415
39273
  x-gala-nullability: required-and-nullable-are-explicit
38416
- x-gala-purpose: read the Prism generation policy
39274
+ x-gala-purpose: list site handover claims
38417
39275
  x-gala-reachable-problems:
38418
39276
  - AUTHENTICATION_REQUIRED
38419
39277
  - AUTHORIZATION_DENIED
39278
+ - REAUTH_REQUIRED
38420
39279
  - RESOURCE_NOT_FOUND
38421
39280
  - VALIDATION_FAILED
38422
39281
  x-gala-replay-identity: safe-query
@@ -38424,11 +39283,10 @@ paths:
38424
39283
  - NONE
38425
39284
  x-gala-success-category: query
38426
39285
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
38427
- /v2/organizations/{organizationId}/publications/{publicationId}/handover:
38428
- get:
39286
+ post:
38429
39287
  description: |
38430
- The organisation owner, with recent authentication; an API key is always refused. Reports the handover of a demo site into the creator's own GitHub account: its state, the target, whether the Galascribe App is installed on the target, each step and the address the site will have. `200` with `state: NOT_STARTED` (empty `steps`, `version` 0, no `target`, `appInstalledOnTarget` or `siteUrlAfter`) for a demo publication (one with a demo-site record) that has no handover yet; `200` with the latest handover otherwise, including `DONE`, `FAILED` and `CANCELLED`; `404 RESOURCE_NOT_FOUND` only for a publication that is not a demo publication.
38431
- operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdHandover
39288
+ The organisation owner, with recent authentication; an API key is always refused. Issues a claim link that hands this site to whoever signs in and accepts it, and returns the claim with its `claimUrl`. `proof` is `LINK_ONLY` (anyone who holds the link and signs in can claim the site, so share it only with the person you mean; it expires and can be revoked) or `YOUTUBE_CHANNEL` (the claimant must also prove they control the channel in `channelId`, which is required for that proof and refused with `LINK_ONLY`: `400 VALIDATION_FAILED`). `expiresInDays` defaults to 30 and is at most 365. A site holds one `OPEN` claim at a time: while one exists the call answers `409 INVALID_SOURCE_STATE` unless `replace` is `true`, which revokes the `OPEN` claim and issues this one in the same transaction, so the old link stops working. A `VERIFIED` claim is never replaced (`409 INVALID_SOURCE_STATE`); revoke it first. A `CLAIMED` claim never blocks a new one, because ownership can chain. `409 INVALID_SOURCE_STATE` also for a site whose organisation is not a single-person organisation, since only a single-person organisation can be handed over. `409 HANDOVER_EXISTS` while a repository move (`/handover`) is live. `404 RESOURCE_NOT_FOUND` for a publication that is not in the organisation. `Idempotency-Key` is the issue identity: repeating it returns the same claim and `claimUrl`.
39289
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaims
38432
39290
  parameters:
38433
39291
  - $ref: "#/components/parameters/XCorrelationId"
38434
39292
  - example: 018f0000-0000-7000-8000-000000000001
@@ -38447,50 +39305,68 @@ paths:
38447
39305
  format: uuid
38448
39306
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38449
39307
  type: string
39308
+ - $ref: "#/components/parameters/IdempotencyKey"
39309
+ - $ref: "#/components/parameters/XCsrfToken"
39310
+ requestBody:
39311
+ content:
39312
+ application/json:
39313
+ examples:
39314
+ nominal:
39315
+ summary: Nominal valid request
39316
+ value:
39317
+ expiresInDays: 30
39318
+ proof: LINK_ONLY
39319
+ youtubeChannel:
39320
+ summary: Proof that the claimant controls a YouTube channel
39321
+ value:
39322
+ channelId: UCabcdefghijklmnopqrstuv
39323
+ proof: YOUTUBE_CHANNEL
39324
+ schema:
39325
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsRequest"
39326
+ required: true
38450
39327
  responses:
38451
- "200":
39328
+ "201":
38452
39329
  content:
38453
39330
  application/json:
38454
39331
  examples:
38455
39332
  nominal:
38456
39333
  summary: Nominal successful response
38457
39334
  value:
38458
- appInstalledOnTarget: true
38459
- siteUrlAfter: https://creator-org.github.io/maya-cooks/
38460
- state: TRANSFER_STARTED
38461
- steps:
38462
- - name: FINALIZE_CHANGE
38463
- state: DONE
38464
- - name: TRANSFER
38465
- state: RUNNING
38466
- - name: RELINK
38467
- state: PENDING
38468
- - name: PAGES
38469
- state: PENDING
38470
- - name: PUBLISH
38471
- state: PENDING
38472
- target:
38473
- kind: ORGANIZATION
38474
- ownerLogin: creator-org
38475
- version: 1
38476
- notStarted:
38477
- summary: Demo publication with no handover yet
38478
- value:
38479
- state: NOT_STARTED
38480
- steps: []
39335
+ claimId: 018f0000-0000-7000-8000-000000000001
39336
+ claimUrl: https://app.galascribe.com/claim/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ
39337
+ createdAt: "2026-10-17T12:00:00.000Z"
39338
+ expiresAt: "2026-11-16T12:00:00.000Z"
39339
+ proof:
39340
+ kind: LINK_ONLY
39341
+ state: OPEN
38481
39342
  version: 0
38482
39343
  schema:
38483
- $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverResponse"
38484
- description: read publication handover succeeded
39344
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsResponse"
39345
+ description: issue site handover claim succeeded
38485
39346
  headers:
38486
39347
  Cache-Control:
38487
39348
  $ref: "#/components/headers/CacheControlNoStore"
39349
+ Location:
39350
+ $ref: "#/components/headers/Location"
38488
39351
  X-Correlation-Id:
38489
39352
  $ref: "#/components/headers/XCorrelationId"
38490
39353
  "400":
38491
39354
  content:
38492
39355
  application/problem+json:
38493
39356
  examples:
39357
+ REQUEST_FIELD_UNKNOWN:
39358
+ summary: REQUEST_FIELD_UNKNOWN
39359
+ value:
39360
+ code: REQUEST_FIELD_UNKNOWN
39361
+ correlationId: 018f0000-0000-7000-8000-000000000001
39362
+ detail: See the operation contract.
39363
+ errors: []
39364
+ retryable: false
39365
+ schemaId: urn:gala:schema:problem:2.0.0
39366
+ schemaVersion: 2.0.0
39367
+ status: 400
39368
+ title: REQUEST_FIELD_UNKNOWN
39369
+ type: urn:gala:problem:request-field-unknown
38494
39370
  VALIDATION_FAILED:
38495
39371
  summary: VALIDATION_FAILED
38496
39372
  value:
@@ -38506,13 +39382,14 @@ paths:
38506
39382
  type: urn:gala:problem:validation-failed
38507
39383
  schema:
38508
39384
  $ref: "#/components/schemas/Problem"
38509
- description: VALIDATION_FAILED
39385
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
38510
39386
  headers:
38511
39387
  Cache-Control:
38512
39388
  $ref: "#/components/headers/CacheControlNoStore"
38513
39389
  X-Correlation-Id:
38514
39390
  $ref: "#/components/headers/XCorrelationId"
38515
39391
  x-gala-problem-codes:
39392
+ - REQUEST_FIELD_UNKNOWN
38516
39393
  - VALIDATION_FAILED
38517
39394
  "401":
38518
39395
  content:
@@ -38609,9 +39486,64 @@ paths:
38609
39486
  $ref: "#/components/headers/XCorrelationId"
38610
39487
  x-gala-problem-codes:
38611
39488
  - RESOURCE_NOT_FOUND
39489
+ "409":
39490
+ content:
39491
+ application/problem+json:
39492
+ examples:
39493
+ COMMAND_REPLAY_CONFLICT:
39494
+ summary: COMMAND_REPLAY_CONFLICT
39495
+ value:
39496
+ code: COMMAND_REPLAY_CONFLICT
39497
+ correlationId: 018f0000-0000-7000-8000-000000000001
39498
+ detail: See the operation contract.
39499
+ errors: []
39500
+ retryable: false
39501
+ schemaId: urn:gala:schema:problem:2.0.0
39502
+ schemaVersion: 2.0.0
39503
+ status: 409
39504
+ title: COMMAND_REPLAY_CONFLICT
39505
+ type: urn:gala:problem:command-replay-conflict
39506
+ HANDOVER_EXISTS:
39507
+ summary: HANDOVER_EXISTS
39508
+ value:
39509
+ code: HANDOVER_EXISTS
39510
+ correlationId: 018f0000-0000-7000-8000-000000000001
39511
+ detail: See the operation contract.
39512
+ errors: []
39513
+ retryable: false
39514
+ schemaId: urn:gala:schema:problem:2.0.0
39515
+ schemaVersion: 2.0.0
39516
+ status: 409
39517
+ title: HANDOVER_EXISTS
39518
+ type: urn:gala:problem:handover-exists
39519
+ INVALID_SOURCE_STATE:
39520
+ summary: INVALID_SOURCE_STATE
39521
+ value:
39522
+ code: INVALID_SOURCE_STATE
39523
+ correlationId: 018f0000-0000-7000-8000-000000000001
39524
+ detail: See the operation contract.
39525
+ errors: []
39526
+ retryable: false
39527
+ schemaId: urn:gala:schema:problem:2.0.0
39528
+ schemaVersion: 2.0.0
39529
+ status: 409
39530
+ title: INVALID_SOURCE_STATE
39531
+ type: urn:gala:problem:invalid-source-state
39532
+ schema:
39533
+ $ref: "#/components/schemas/Problem"
39534
+ description: COMMAND_REPLAY_CONFLICT, HANDOVER_EXISTS, INVALID_SOURCE_STATE
39535
+ headers:
39536
+ Cache-Control:
39537
+ $ref: "#/components/headers/CacheControlNoStore"
39538
+ X-Correlation-Id:
39539
+ $ref: "#/components/headers/XCorrelationId"
39540
+ x-gala-problem-codes:
39541
+ - COMMAND_REPLAY_CONFLICT
39542
+ - HANDOVER_EXISTS
39543
+ - INVALID_SOURCE_STATE
38612
39544
  security:
38613
39545
  - browserSession: []
38614
- summary: read publication handover
39546
+ summary: issue site handover claim
38615
39547
  tags:
38616
39548
  - organizations
38617
39549
  x-gala-action-grant: none
@@ -38624,22 +39556,30 @@ paths:
38624
39556
  x-gala-conditional-capabilities: []
38625
39557
  x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
38626
39558
  x-gala-nullability: required-and-nullable-are-explicit
38627
- x-gala-purpose: read publication handover
39559
+ x-gala-purpose: issue site handover claim
38628
39560
  x-gala-reachable-problems:
38629
39561
  - AUTHENTICATION_REQUIRED
38630
39562
  - AUTHORIZATION_DENIED
39563
+ - COMMAND_REPLAY_CONFLICT
39564
+ - HANDOVER_EXISTS
39565
+ - INVALID_SOURCE_STATE
38631
39566
  - REAUTH_REQUIRED
39567
+ - REQUEST_FIELD_UNKNOWN
38632
39568
  - RESOURCE_NOT_FOUND
38633
39569
  - VALIDATION_FAILED
38634
- x-gala-replay-identity: safe-query
39570
+ x-gala-replay-identity: idempotency-key
38635
39571
  x-gala-state-guards:
38636
- - NONE
38637
- x-gala-success-category: query
39572
+ - Publication:ACTIVE
39573
+ - Organization:SINGLE
39574
+ - CreatorClaim:no VERIFIED claim
39575
+ - CreatorClaim:OPEN -> REVOKED when replace is true, otherwise no OPEN claim
39576
+ x-gala-success-category: create
38638
39577
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
39578
+ /v2/organizations/{organizationId}/publications/{publicationId}/handover-claims/{claimId}:revoke:
38639
39579
  post:
38640
39580
  description: |
38641
- The organisation owner, with recent authentication; an API key is always refused. Moves a demo site's repository into `targetOwnerLogin` (a person or an organisation where the Galascribe App is installed): plans and confirms the finalize change in the caller's session, then starts the GitHub transfer. `202` accepts; `GET` reports progress. `409 HANDOVER_EXISTS` while one is live, `409 HANDOVER_TARGET_NOT_INSTALLED` when the App is not installed on the target, `503 DEPENDENCY_UNAVAILABLE` when GitHub cannot be reached. `404 RESOURCE_NOT_FOUND` when the publication is not a demo site. The response never carries `state: NOT_STARTED`.
38642
- operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdHandover
39581
+ The organisation owner, with recent authentication; an API key is always refused. Revokes an `OPEN` or `VERIFIED` claim: its link stops working at once (`GET /v2/claims/{token}` answers `404 CLAIM_NOT_FOUND`) and any verification a claimant completed is discarded. Revoking a `REVOKED` claim returns it unchanged. `409 CLAIM_ALREADY_CLAIMED` once the site has been claimed, `410 CLAIM_EXPIRED` once the claim has expired, `404 RESOURCE_NOT_FOUND` for a claim that is not this site's.
39582
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsByClaimIdRevoke
38643
39583
  parameters:
38644
39584
  - $ref: "#/components/parameters/XCorrelationId"
38645
39585
  - example: 018f0000-0000-7000-8000-000000000001
@@ -38658,70 +39598,45 @@ paths:
38658
39598
  format: uuid
38659
39599
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38660
39600
  type: string
39601
+ - example: 018f0000-0000-7000-8000-000000000001
39602
+ in: path
39603
+ name: claimId
39604
+ required: true
39605
+ schema:
39606
+ format: uuid
39607
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
39608
+ type: string
38661
39609
  - $ref: "#/components/parameters/IdempotencyKey"
38662
39610
  - $ref: "#/components/parameters/XCsrfToken"
38663
- requestBody:
38664
- content:
38665
- application/json:
38666
- examples:
38667
- nominal:
38668
- summary: Nominal valid request
38669
- value:
38670
- targetOwnerLogin: creator-org
38671
- schema:
38672
- $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverRequest"
38673
- required: true
38674
39611
  responses:
38675
- "202":
39612
+ "200":
38676
39613
  content:
38677
39614
  application/json:
38678
39615
  examples:
38679
39616
  nominal:
38680
39617
  summary: Nominal successful response
38681
39618
  value:
38682
- appInstalledOnTarget: true
38683
- siteUrlAfter: https://creator-org.github.io/maya-cooks/
38684
- state: REQUESTED
38685
- steps:
38686
- - name: FINALIZE_CHANGE
38687
- state: DONE
38688
- - name: TRANSFER
38689
- state: RUNNING
38690
- - name: RELINK
38691
- state: PENDING
38692
- - name: PAGES
38693
- state: PENDING
38694
- - name: PUBLISH
38695
- state: PENDING
38696
- target:
38697
- kind: ORGANIZATION
38698
- ownerLogin: creator-org
39619
+ claimId: 018f0000-0000-7000-8000-000000000001
39620
+ createdAt: "2026-10-17T12:00:00.000Z"
39621
+ expiresAt: "2026-11-16T12:00:00.000Z"
39622
+ proof:
39623
+ kind: LINK_ONLY
39624
+ state: REVOKED
38699
39625
  version: 1
38700
39626
  schema:
38701
- $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverResponse"
38702
- description: start publication handover succeeded
39627
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdHandoverClaimsByClaimIdRevokeResponse"
39628
+ description: revoke site handover claim succeeded
38703
39629
  headers:
38704
39630
  Cache-Control:
38705
39631
  $ref: "#/components/headers/CacheControlNoStore"
39632
+ ETag:
39633
+ $ref: "#/components/headers/ETag"
38706
39634
  X-Correlation-Id:
38707
39635
  $ref: "#/components/headers/XCorrelationId"
38708
39636
  "400":
38709
39637
  content:
38710
39638
  application/problem+json:
38711
39639
  examples:
38712
- REQUEST_FIELD_UNKNOWN:
38713
- summary: REQUEST_FIELD_UNKNOWN
38714
- value:
38715
- code: REQUEST_FIELD_UNKNOWN
38716
- correlationId: 018f0000-0000-7000-8000-000000000001
38717
- detail: See the operation contract.
38718
- errors: []
38719
- retryable: false
38720
- schemaId: urn:gala:schema:problem:2.0.0
38721
- schemaVersion: 2.0.0
38722
- status: 400
38723
- title: REQUEST_FIELD_UNKNOWN
38724
- type: urn:gala:problem:request-field-unknown
38725
39640
  VALIDATION_FAILED:
38726
39641
  summary: VALIDATION_FAILED
38727
39642
  value:
@@ -38737,14 +39652,13 @@ paths:
38737
39652
  type: urn:gala:problem:validation-failed
38738
39653
  schema:
38739
39654
  $ref: "#/components/schemas/Problem"
38740
- description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
39655
+ description: VALIDATION_FAILED
38741
39656
  headers:
38742
39657
  Cache-Control:
38743
39658
  $ref: "#/components/headers/CacheControlNoStore"
38744
39659
  X-Correlation-Id:
38745
39660
  $ref: "#/components/headers/XCorrelationId"
38746
39661
  x-gala-problem-codes:
38747
- - REQUEST_FIELD_UNKNOWN
38748
39662
  - VALIDATION_FAILED
38749
39663
  "401":
38750
39664
  content:
@@ -38845,23 +39759,10 @@ paths:
38845
39759
  content:
38846
39760
  application/problem+json:
38847
39761
  examples:
38848
- COMMAND_REPLAY_CONFLICT:
38849
- summary: COMMAND_REPLAY_CONFLICT
38850
- value:
38851
- code: COMMAND_REPLAY_CONFLICT
38852
- correlationId: 018f0000-0000-7000-8000-000000000001
38853
- detail: See the operation contract.
38854
- errors: []
38855
- retryable: false
38856
- schemaId: urn:gala:schema:problem:2.0.0
38857
- schemaVersion: 2.0.0
38858
- status: 409
38859
- title: COMMAND_REPLAY_CONFLICT
38860
- type: urn:gala:problem:command-replay-conflict
38861
- HANDOVER_EXISTS:
38862
- summary: HANDOVER_EXISTS
39762
+ CLAIM_ALREADY_CLAIMED:
39763
+ summary: CLAIM_ALREADY_CLAIMED
38863
39764
  value:
38864
- code: HANDOVER_EXISTS
39765
+ code: CLAIM_ALREADY_CLAIMED
38865
39766
  correlationId: 018f0000-0000-7000-8000-000000000001
38866
39767
  detail: See the operation contract.
38867
39768
  errors: []
@@ -38869,12 +39770,12 @@ paths:
38869
39770
  schemaId: urn:gala:schema:problem:2.0.0
38870
39771
  schemaVersion: 2.0.0
38871
39772
  status: 409
38872
- title: HANDOVER_EXISTS
38873
- type: urn:gala:problem:handover-exists
38874
- HANDOVER_TARGET_NOT_INSTALLED:
38875
- summary: HANDOVER_TARGET_NOT_INSTALLED
39773
+ title: CLAIM_ALREADY_CLAIMED
39774
+ type: urn:gala:problem:claim-already-claimed
39775
+ COMMAND_REPLAY_CONFLICT:
39776
+ summary: COMMAND_REPLAY_CONFLICT
38876
39777
  value:
38877
- code: HANDOVER_TARGET_NOT_INSTALLED
39778
+ code: COMMAND_REPLAY_CONFLICT
38878
39779
  correlationId: 018f0000-0000-7000-8000-000000000001
38879
39780
  detail: See the operation contract.
38880
39781
  errors: []
@@ -38882,50 +39783,49 @@ paths:
38882
39783
  schemaId: urn:gala:schema:problem:2.0.0
38883
39784
  schemaVersion: 2.0.0
38884
39785
  status: 409
38885
- title: HANDOVER_TARGET_NOT_INSTALLED
38886
- type: urn:gala:problem:handover-target-not-installed
39786
+ title: COMMAND_REPLAY_CONFLICT
39787
+ type: urn:gala:problem:command-replay-conflict
38887
39788
  schema:
38888
39789
  $ref: "#/components/schemas/Problem"
38889
- description: COMMAND_REPLAY_CONFLICT, HANDOVER_EXISTS, HANDOVER_TARGET_NOT_INSTALLED
39790
+ description: CLAIM_ALREADY_CLAIMED, COMMAND_REPLAY_CONFLICT
38890
39791
  headers:
38891
39792
  Cache-Control:
38892
39793
  $ref: "#/components/headers/CacheControlNoStore"
38893
39794
  X-Correlation-Id:
38894
39795
  $ref: "#/components/headers/XCorrelationId"
38895
39796
  x-gala-problem-codes:
39797
+ - CLAIM_ALREADY_CLAIMED
38896
39798
  - COMMAND_REPLAY_CONFLICT
38897
- - HANDOVER_EXISTS
38898
- - HANDOVER_TARGET_NOT_INSTALLED
38899
- "503":
39799
+ "410":
38900
39800
  content:
38901
39801
  application/problem+json:
38902
39802
  examples:
38903
- DEPENDENCY_UNAVAILABLE:
38904
- summary: DEPENDENCY_UNAVAILABLE
39803
+ CLAIM_EXPIRED:
39804
+ summary: CLAIM_EXPIRED
38905
39805
  value:
38906
- code: DEPENDENCY_UNAVAILABLE
39806
+ code: CLAIM_EXPIRED
38907
39807
  correlationId: 018f0000-0000-7000-8000-000000000001
38908
39808
  detail: See the operation contract.
38909
39809
  errors: []
38910
- retryable: true
39810
+ retryable: false
38911
39811
  schemaId: urn:gala:schema:problem:2.0.0
38912
39812
  schemaVersion: 2.0.0
38913
- status: 503
38914
- title: DEPENDENCY_UNAVAILABLE
38915
- type: urn:gala:problem:dependency-unavailable
39813
+ status: 410
39814
+ title: CLAIM_EXPIRED
39815
+ type: urn:gala:problem:claim-expired
38916
39816
  schema:
38917
39817
  $ref: "#/components/schemas/Problem"
38918
- description: DEPENDENCY_UNAVAILABLE
39818
+ description: CLAIM_EXPIRED
38919
39819
  headers:
38920
39820
  Cache-Control:
38921
39821
  $ref: "#/components/headers/CacheControlNoStore"
38922
39822
  X-Correlation-Id:
38923
39823
  $ref: "#/components/headers/XCorrelationId"
38924
39824
  x-gala-problem-codes:
38925
- - DEPENDENCY_UNAVAILABLE
39825
+ - CLAIM_EXPIRED
38926
39826
  security:
38927
39827
  - browserSession: []
38928
- summary: start publication handover
39828
+ summary: revoke site handover claim
38929
39829
  tags:
38930
39830
  - organizations
38931
39831
  x-gala-action-grant: none
@@ -38938,22 +39838,20 @@ paths:
38938
39838
  x-gala-conditional-capabilities: []
38939
39839
  x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
38940
39840
  x-gala-nullability: required-and-nullable-are-explicit
38941
- x-gala-purpose: start publication handover
39841
+ x-gala-purpose: revoke site handover claim
38942
39842
  x-gala-reachable-problems:
38943
39843
  - AUTHENTICATION_REQUIRED
38944
39844
  - AUTHORIZATION_DENIED
39845
+ - CLAIM_ALREADY_CLAIMED
39846
+ - CLAIM_EXPIRED
38945
39847
  - COMMAND_REPLAY_CONFLICT
38946
- - DEPENDENCY_UNAVAILABLE
38947
- - HANDOVER_EXISTS
38948
- - HANDOVER_TARGET_NOT_INSTALLED
38949
39848
  - REAUTH_REQUIRED
38950
- - REQUEST_FIELD_UNKNOWN
38951
39849
  - RESOURCE_NOT_FOUND
38952
39850
  - VALIDATION_FAILED
38953
39851
  x-gala-replay-identity: idempotency-key
38954
39852
  x-gala-state-guards:
38955
39853
  - NONE
38956
- x-gala-success-category: async
39854
+ x-gala-success-category: update
38957
39855
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
38958
39856
  /v2/organizations/{organizationId}/publications/{publicationId}/handover:cancel:
38959
39857
  post: