Xema Store API: schemas

The request and response bodies of the operations in this API.

BiomeCategory

Section this listing is filed under, DERIVED from the biome manifest. Null means not filed yet — a storefront renders those together rather than inventing a section for them.

Type: string (9 values)

BiomeLifecycle

Store-scoped lifecycle. Only store-submitted, store-approved, and archived are reachable from this service.

Type: one of "draft", "sandbox-installed", "review-required", "org-installed", "store-submitted", "store-approved", "archived"

BiomeTrustTier

Provenance tier — primary input to the install consent flow.

Type: one of "system", "first-party", "verified-store", "community-store", "private-org", "generated-sandbox"

CommentListingVersionDto

PropertyTypeRequiredDescription
notesstringyes

CreateStoreListingDto

PropertyTypeRequiredDescription
biomeIdstringyes
categoryBiomeCategorynoThe manifest-derived section. Accepted on CREATE because the reconciler carries it from the manifest; deliberately absent from UpdateStoreListingDto, because re-filing a biome is a manifest change and a second authored copy is the drift the derived/editorial split exists to prevent.
descriptionstringyes
displayNamestringyes
pricingPolicyStorePricingPolicyDtonoOmitted ≡ free. Validated strictly against PricingPolicySchema (400 STORE_LISTING_PRICING_POLICY_INVALID on violation).
publisherstringnoPRODUCER-STATED, and REQUIRED for scope: global — resolved from the trust anchor that verified the bundle. REFUSED for scope: org (400 STORE_LISTING_PROVENANCE_NOT_ACCEPTED), where it is the authenticated org.
revenueShareStoreRevenueShareDtonoStore-side revenue-share config. Validated strictly against RevenueShareSchema (400 STORE_LISTING_REVENUE_SHARE_INVALID).
scopeStoreScopeyes
trustTierBiomeTrustTiernoPRODUCER-STATED, and REQUIRED for scope: global — resolved from the distribution lock's biome tier. REFUSED for scope: org (400 STORE_LISTING_PROVENANCE_NOT_ACCEPTED), where it is always private-org: nobody reviewed the biome.

PaginationMeta

PropertyTypeRequiredDescription
hasMorebooleanno
limitnumberno
nextCursorstring or nullno
pagenumberno
previousCursorstring or nullno
totalnumberno
totalPagesnumberno

PricingPolicyKind

free = no license is needed. licensed = the listing is sold under the billing entitlement named by entitlementKey. The Store lists and licenses; installation is performed by the platform.

Type: one of "free", "licensed"

ProblemActionableBy

Who can act on this refusal: user (correct the input, sign in), org-admin (an administrator of the organisation), platform (the operators of this installation), none (nobody — it cannot succeed). ABSENT when not known; never guessed.

Type: one of "user", "org-admin", "platform", "none"

ProblemDetailsDto

RFC 9457 problem document. The declared members are the reserved core; extension members are TOP-LEVEL and OPEN, owned by the refusing plane.

PropertyTypeRequiredDescription
actionableByProblemActionableBynoWho can act on this refusal: user (correct the input, sign in), org-admin (an administrator of the organisation), platform (the operators of this installation), none (nobody — it cannot succeed). ABSENT when not known; never guessed.
codestringyesSCREAMING_SNAKE_CASE. The machine-branchable refusal, and the value a policy rule, a retry predicate and a UI branch all name.
detailstringnoHuman-readable and specific to THIS occurrence.
errorsarray of ProblemFieldIssueDtonoField-level issues, when the refusal is about the request body.
instancestringnoURI reference identifying the occurrence — a request path, a run, a row.
paramsmap of string or number or booleannoSafe i18n interpolation values for the message keyed by code — typed and allowlisted per code by its declaration. Never server-authored copy, never internal diagnostics.
retryProblemRetrynoWhat a retry can achieve: transient (later, unchanged), after-change (only after someone changes something), never (a defect until a fixed version ships). ABSENT when not known.
statusnumberyesThe HTTP status code, repeated in the body so a logged document is self-contained.
titlestringyesShort, human-readable, and STABLE for a given type. Never per-occurrence — that is detail.
traceIdstringnoW3C trace-context trace-id, present when the caller sent a traceparent. Omitted rather than invented when it did not.
typestringyesAbsolute URI identifying the refusal TYPE. Derived one-to-one from code, so a caller may branch on either and can never be told two different things. Never about:blank.

ProblemFieldIssueDto

PropertyTypeRequiredDescription
codestringnoSCREAMING_SNAKE_CASE code of THIS issue, for a frontend i18n key. Present when the issue was minted by a declared problem.
detailstringyesProse for logs and developers. A frontend localises from code + params instead.
paramsmap of string or number or booleannoSafe i18n interpolation values for this issue's code.
pointerstringyesRFC 6901 JSON Pointer into the request body. Root is "/".

ProblemRetry

What a retry can achieve: transient (later, unchanged), after-change (only after someone changes something), never (a defect until a fixed version ships). ABSENT when not known.

Type: one of "transient", "after-change", "never"

ProvenanceVerdict

Supply-chain provenance verdict captured at submit time.

Type: one of "VALID", "INVALID", "MISSING"

SignatureVerdict

Supply-chain signature verdict captured at submit time.

Type: one of "VALID", "INVALID", "UNSIGNED"

StagedUploadSlotDto

PropertyTypeRequiredDescription
contentTypestringyesContent type pinned into the signature.
expiresAtstring (date-time)yesWhen the presigned URL stops being accepted.
putUrlstringyesPresigned URL to PUT the .tgz to. Expires; mint another rather than caching it.
requiredHeadersmap of stringyesHeaders that MUST be sent verbatim with the PUT. The backend signs Content-Type into the canonical request, so altering or dropping these fails the signature check rather than producing a useful error.
uploadIdstringyesOpaque handle for the staged object. Pass back as the submission's stagedUploadId — do not parse it.

StagedUploadSlotDtoDataEnvelope

PropertyTypeRequiredDescription
dataStagedUploadSlotDtoyes

StoreLicenseDto

PropertyTypeRequiredDescription
entitlementKeystringyesThe EFFECTIVE billing entitlement recorded when the license was issued (the selected plan’s per-tier key when set, else the policy-level key).
idstringyes
installIdstring or nullnoThe install that issued this license (null if detached).
issuedAtstring (date-time)yes
issuedByIdstringyes
listingIdstringyes
listingVersionIdstringyes
orgIdstringyes
planstring or nullnoSelected plan tier id, or null when no named tier was chosen.
revokedAtstring (date-time) or nullno
revokedByIdstring or nullno
statusStoreLicenseStatusyesactive = currently held. revoked = admin-revoked.

StoreLicenseDtoDataEnvelope

PropertyTypeRequiredDescription
dataStoreLicenseDtoyes

StoreLicenseDtoPaginatedEnvelope

PropertyTypeRequiredDescription
dataarray of StoreLicenseDtoyes
paginationPaginationMetayes

StoreLicenseStatus

active = currently held. revoked = admin-revoked.

Type: one of "active", "revoked"

StoreListingDto

PropertyTypeRequiredDescription
archivedbooleanyes
biomeIdstringyesThe biome's canonical id (e.g. 'document-buddy').
categoryBiomeCategory or nullnoSection this listing is filed under, DERIVED from the biome manifest. Null means not filed yet — a storefront renders those together rather than inventing a section for them.
createdAtstring (date-time)yes
descriptionstringyes
descriptionOverriddenbooleanyesAs displayNameOverridden, for the description.
displayNamestringyes
displayNameOverriddenbooleanyesTrue when displayName above is the operator OVERRIDE rather than the reconciled text. The console shows "overridden from manifest"; clearing the override (PATCH with null) reverts.
featuredbooleanyesOperator-curated featured flag. The storefront shelf reads THIS, not a trust-tier proxy.
idstringyes
latestVersionstring or nullyesVersion string of the newest PUBLISHED (store-approved) version, ordered by submittedAt desc — the same ordering the versions endpoint uses. null when the listing has no approved version yet.
orgIdstring or nullnoTenancy/visibility scope: the owning org's id when scope = org; null for global listings. NOT the publisher — see publisherOrgId.
pricingStorePricingSummaryDtoyesDerived storefront pricing summary (kind + badge + plans). Always present — a storefront badges + renders tiers from this without touching the raw policy.
pricingPolicyStorePricingPolicyDto or nullyesTyped pricing policy, or null when the listing is unpriced (null ≡ free). Storefronts badge kind = licensed listings. The Store does not install; installation is performed by the platform. Prefer the derived pricing summary for badging.
publicationStateStorePublicationStateyesWhether this deployment shows the listing. Distinct from archived, which is a lifecycle terminal — withholding is reversible.
publisherstringyes
publisherOrgIdstring or nullnoProvenance: the org that PUBLISHED this listing. Set for BOTH scope = org and scope = global rows and derived server-side from the authenticated publisher org at create time (never client-supplied). Null ONLY on legacy global listings created before the column existed, whose publisher org is unknowable and which an org erasure therefore reports as unattributable instead of silently skipping.
revenueShareStoreRevenueShareDto or nullyesStore-side revenue-share config, or null when none is set. Records the publisher payout split; the actual settlement is a billing-api follow-up (the Store only persists the config).
scopeStoreScopeyesCatalog scope. Global = cross-org; Org = single-org catalog.
sortWeightnumberyesOperator ordering weight; higher sorts first.
trustTierBiomeTrustTieryesProvenance tier — primary input to the install consent flow.
updatedAtstring (date-time)yes

StoreListingDtoDataEnvelope

PropertyTypeRequiredDescription
dataStoreListingDtoyes

StoreListingDtoPaginatedEnvelope

PropertyTypeRequiredDescription
dataarray of StoreListingDtoyes
paginationPaginationMetayes

StoreListingVersionDto

PropertyTypeRequiredDescription
approvedAtstring (date-time) or nullno
approvedByIdstring or nullno
archivedAtstring (date-time) or nullno
bundleShastring or nullno
bundleUristring or nullno
compatibilityEvidenceobjectyes
contentHashstringyesImmutable canonical content hash for this authored revision.
dependenciesarray of objectyesOwner-qualified dependency targets published with this revision.
hostContractVersionstring or nullnoHost-contract version the web remote was built against.
idstringyes
lifecycleBiomeLifecycleyesStore-scoped lifecycle. Only store-submitted, store-approved, and archived are reachable from this service.
listingIdstringyes
manifestSnapshotobjectyesFrozen BiomeManifest at submission time.
notesstring or nullno
permissionDigestobjectyesCanonical digest derived from requiresCapabilities + exposesCapabilities.
provenanceVerdictProvenanceVerdict or nullnoSupply-chain provenance verdict captured at submit time.
releasePolicyEvidenceobjectyes
releaseRequestIdstring or nullno
releaseRequestStatusstring or nullno
signatureVerdictSignatureVerdict or nullnoSupply-chain signature verdict captured at submit time.
submittedAtstring (date-time)yes
versionstringyes
webExposedModulestring or nullnoBARE exposed-module key the host loads from the container (e.g. biome). Carries no ./ prefix — loadRemote takes <container>/<key>.
webIntegritystring or nullnoSub-resource integrity of the remote-entry artifact.
webRemoteEntryUrlstring or nullnoREMOTE_FEDERATED remote-entry URL (target:web biomes).
webRemoteNamestring or nullnoModule-Federation container name the built remote self-registers under (e.g. grants_web_remote). NOT the npm package name.

StoreListingVersionDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of StoreListingVersionDtoyes

StoreListingVersionDtoDataEnvelope

PropertyTypeRequiredDescription
dataStoreListingVersionDtoyes

StorePlanDto

PropertyTypeRequiredDescription
displayNamestringyes
entitlementKeystringnoPer-tier billing feature-flag. When set, selecting this plan gates the install on THIS key instead of the policy-level entitlementKey. When omitted the plan inherits the policy-level entitlementKey.
idstringyesStable, per-policy-unique plan id the install references.
priceHintstringnoAdvisory price label (e.g. "$29/mo"). NOT an enforcement input; its presence flips the storefront badge from licensed to paid.

StorePricingBadge

Storefront badge. free = no policy / kind=free. licensed = entitlement-gated, no displayed price. paid = licensed AND at least one plan carries a priceHint.

Type: one of "free", "licensed", "paid"

StorePricingPolicyDto

PropertyTypeRequiredDescription
entitlementKeystringnobilling-api feature-flag name that entitles an org to the listing. Required when kind = licensed; forbidden when kind = free.
kindPricingPolicyKindyesfree = no license is needed. licensed = the listing is sold under the billing entitlement named by entitlementKey. The Store lists and licenses; installation is performed by the platform.
planstringnoAdvisory storefront metadata: which plan grants the entitlement. NOT an enforcement input. Only allowed when kind = licensed.
plansarray of StorePlanDtonoNamed plan tiers (phase 2). Optional — pre-phase-2 policies parse unchanged. An install selects one via planId; a per-tier entitlementKey overrides the policy-level key for that tier. Only allowed when kind = licensed.

StorePricingSummaryDto

PropertyTypeRequiredDescription
badgeStorePricingBadgeyesStorefront badge. free = no policy / kind=free. licensed = entitlement-gated, no displayed price. paid = licensed AND at least one plan carries a priceHint.
kindPricingPolicyKindyesPolicy kind (free | licensed). free for unpriced listings.
plansarray of StorePlanDtonoNamed plan tiers, when the licensed policy declares them.

StorePublicationState

Whether this deployment shows the listing. Distinct from archived, which is a lifecycle terminal — withholding is reversible.

Type: one of "published", "withheld"

StoreRevenueShareDto

PropertyTypeRequiredDescription
publisherAccountRefstringyesThe payee's billing Account.externalRef. Resolved by the future settlement job against billing-api; the Store only persists it.
sharePercentnumberyesThe publisher's cut, 0–100 inclusive (≤2 decimals). Stored verbatim; the Store never applies it.

StoreReviewAction

Type: one of "submit", "approve", "reject", "archive", "comment"

StoreReviewLogEntryDto

PropertyTypeRequiredDescription
actionStoreReviewActionyes
actorIdstringyes
createdAtstring (date-time)yes
idstringyes
listingVersionIdstringyes
notesstring or nullno

StoreReviewLogEntryDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of StoreReviewLogEntryDtoyes

StoreScope

Catalog scope. Global = cross-org; Org = single-org catalog.

Type: one of "global", "org"

SubmitListingVersionDto

PropertyTypeRequiredDescription
bundleShastringnoIntegrity hash of the bundle. Optional at Phase 8.
bundleUristringnoWhere the biome bundle is fetched from (OCI ref or git+ref). Stored as a placeholder at Phase 8.
compatibilityEvidenceobjectyesCompatibility evaluation inputs frozen with this immutable package revision.
dependenciesarray of objectyesOwner-qualified RevisionTarget dependency intents resolved atomically by the generic release plane.
manifestSnapshotobjectyesFull BiomeManifest document (xema-biome.json).
notesstringno
releasePolicyEvidenceobjectyesRelease policy inputs frozen with this immutable package revision.
stagedUploadIdstringnoHandle of a bundle staged through POST /listings/:id/versions/staging (Grow plane A1). Opaque — pass back exactly what the staging response returned. REQUIRES bundleSha: staging and fetching are two moments, and every verdict downstream is computed over whatever bytes arrive, so a staged submission with no digest is bytes nothing can bind a verdict to. Distinct from bundleUri, which is an OCI or git ref.
versionstringyesSemver version. Unique within the listing.
webArtifactSubmitWebArtifactDtonoREMOTE_FEDERATED web-artifact facts for a target:web biome. Omit for server biomes.

SubmitListingVersionResponseDto

PropertyTypeRequiredDescription
approvedAtstring (date-time) or nullno
approvedByIdstring or nullno
archivedAtstring (date-time) or nullno
bundleShastring or nullno
bundleUristring or nullno
compatibilityEvidenceobjectyes
contentHashstringyesImmutable canonical content hash for this authored revision.
dependenciesarray of objectyesOwner-qualified dependency targets published with this revision.
hostContractVersionstring or nullnoHost-contract version the web remote was built against.
idstringyes
lifecycleBiomeLifecycleyesStore-scoped lifecycle. Only store-submitted, store-approved, and archived are reachable from this service.
listingIdstringyes
manifestSnapshotobjectyesFrozen BiomeManifest at submission time.
notesstring or nullno
permissionDigestobjectyesCanonical digest derived from requiresCapabilities + exposesCapabilities.
provenanceVerdictProvenanceVerdict or nullnoSupply-chain provenance verdict captured at submit time.
releasePolicyEvidenceobjectyes
releaseRequestIdstring or nullno
releaseRequestStatusstring or nullno
signatureVerdictSignatureVerdict or nullnoSupply-chain signature verdict captured at submit time.
submittedAtstring (date-time)yes
versionstringyes
webExposedModulestring or nullnoBARE exposed-module key the host loads from the container (e.g. biome). Carries no ./ prefix — loadRemote takes <container>/<key>.
webIntegritystring or nullnoSub-resource integrity of the remote-entry artifact.
webRemoteEntryUrlstring or nullnoREMOTE_FEDERATED remote-entry URL (target:web biomes).
webRemoteNamestring or nullnoModule-Federation container name the built remote self-registers under (e.g. grants_web_remote). NOT the npm package name.

SubmitListingVersionResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataSubmitListingVersionResponseDtoyes

SubmitWebArtifactDto

PropertyTypeRequiredDescription
exposedModulestringyesBARE exposed-module key the host loads from the container (e.g. biome). Module Federation loadRemote takes <container>/<key>, so the key carries NO ./ prefix — the host composes the specifier itself. There is exactly ONE spelling on the wire.
hostContractVersionstringyesHost-contract version the remote was built against.
integritystringyesSub-resource integrity hash of the remote-entry artifact.
provenanceRefstringnoSLSA provenance attestation reference (relative filename alongside the remote-entry, or an absolute URL). The provenanceVerdict is computed server-side, not client-trusted.
remoteEntrystringyesModule-Federation remote-entry URL (remoteEntry.js).
remoteNamestringyesModule-Federation CONTAINER name the built remote self-registers under at runtime (e.g. grants_web_remote for biome id grants-web). This is NOT the npm package name — the two are unrelated strings, and substituting the package name yields a container the host can never resolve. Carried end-to-end from the publish descriptor to the host loader and NEVER re-derived.
signatureBundleRefstringnoSigstore signature bundle for remoteEntry.js (relative filename alongside the remote-entry, or an absolute URL). The store verifies it server-side with cosign — the resulting signatureVerdict is NOT client-trusted.

UpdateStoreListingDto

PropertyTypeRequiredDescription
descriptionstring or nullnoOverride the reconciled description. Explicit null clears the override. Omitted = unchanged.
displayNamestring or nullnoOverride the reconciled display name. Explicit null CLEARS the override, so the listing falls back to the distribution-plane text — that is what "revert to the manifest" means here. Omitted = unchanged.
featuredbooleannoCurated featured flag — what the storefront shelf reads.
pricingPolicyStorePricingPolicyDto or nullnoReplace the pricing policy. Explicit null clears it back to unpriced (≡ free). Omitted = unchanged. Validated strictly against PricingPolicySchema (400 STORE_LISTING_PRICING_POLICY_INVALID).
publicationStateStorePublicationStatenoWithhold or publish this listing IN THIS DEPLOYMENT. Not archival. Archiving is a lifecycle terminal gated on store:biome.archive@1; this is reversible and local, which is what an operator curating a catalog actually needs.
revenueShareStoreRevenueShareDto or nullnoReplace the revenue-share config. Explicit null clears it. Omitted = unchanged. Validated strictly against RevenueShareSchema (400 STORE_LISTING_REVENUE_SHARE_INVALID).
sortWeightnumbernoOperator ordering weight; higher sorts first.