Integrateprovider-admin
POST/admin/provider-submissions/{submission_id}/request-changes
Request changes on a provider submission
request_provider_changes
provider_admin:manage
A token needs theprovider_admin:managescope: Review, feature and sunset provider submissionsGranted bywrite_api.Every operation this scope unlocksAudited · mutation
x-gitmoap-audit: {"kind":"audited","arg":"mutation"}
Closes the submission with a reason saying what must change, which the publisher can read on
it; the publisher then submits a corrected version as a new submission. Only a submission
awaiting review qualifies, and a reason is required. Platform administrators only.
Parameters
Path
- submission_idProviderSubmissionId (string · uuid)Submission id
Request body
application/json- notestring or nulloptional
- reasonstring or nulloptional
Request body exampleSynthesized example
{}
Responses
200application/json
- auth_schemaobject
manifestProviderVersionManifestThe provider version as submitted. Image locations and digests, signing and lifecycle are filled in by the platform when the version is published.
- The ProviderVersionManifest schema
capabilitiesarray of CapabilityDescriptor
- The CapabilityDescriptor schema
- cache_enabledboolean
- capability_idCapabilityId (string)
- config_schemaobjectThe JSON Schema a step's
configmust satisfy to use this capability. - default_timeout_secondsinteger · int320–∞
- descriptionstring
- image_uristringThe container image that runs the capability, with an immutable version tag.
- inputsarray of PortDescriptor
- namestring
- outputsarray of PortDescriptor
- requires_dockerboolean
- stage_typeStageTypesourcebuildtestpublishdeploynotifycustomThe pipeline stage a capability belongs to. Maps verbatim to the
stage_typefield of a capability ingitmoap-provider.yaml. - bindablearray of PortName (string)optionalConfig keys that can take their value from an earlier step. Each has an optional
valueinput port of the same name: connect it and read it with{"$from": "<key>"}, or leave it unconnected and write the value yourself. - image_digeststring or nulloptionalThe exact build of the capability's container image, when the catalog records one. Pinned so a run cannot pick up a different build behind the same tag.
- input_groupsarray of PortGroupoptionalRules about which inputs are alternatives to each other. Empty for most capabilities.
- source_image_refstring or nulloptionalFor a verified provider, the image's location in its publisher's registry before gitmoap copied it. Absent for providers gitmoap builds itself.
- contract_versioninteger · int320–∞
- manifest_digeststringThe SHA-256 digest of the version's
gitmoap-provider.yaml. May be empty. - provider_idProviderId (string)
- published_atstring
- published_bystring
"platform"for platform-authored providers; a publisher id otherwise. - versionProviderVersion (string)
- changelogMarkdownDoc (string) or nulloptionalThe version's release notes, in Markdown, up to 64 KB. They cannot be changed once published. Absent when the version has none.
- cosign_signature_refstring or nulloptionalWhere the cosign signature is stored in the registry, when the images are signed.
- lifecycle_stateVersionLifecycleactivedeprecatedsunsetoptionalWhere the version is in its life:
active,deprecatedorsunset. Checked whenever a run starts. - signedbooleanoptionalWhether the version's images are signed with gitmoap's cosign key, as verified and platform providers' are.
- sunset_atstring or nulloptionalWhen the version was sunset. Set only for a sunset version.
- sunset_enforced_atstring or nulloptionalWhen the sunset's grace period ends. After it, a run that uses the version fails to start.
- manifest_digeststring
- provider_descriptionstring
- provider_idProviderId (string)
- provider_namestringThe provider's name, as the catalog shows it.
- publisher_idPublisherId (string · uuid)
- source_image_refsobjectEach capability's image in your registry, by capability id.
- stateSubmissionStatesubmittedin_reviewchanges_requestedapprovedmirroringsigningpublishedrejectedmirror_failedwithdrawnverifyingverification_failedWhere a provider submission stands, from review through to publication or refusal.
- submission_idProviderSubmissionId (string · uuid)
- submitted_atstring
submitted_byActorSummaryWho submitted the version.
- The ActorSummary schema
- emailstring
- idstring
- usernamestring
- avatar_urlstring or nulloptional
- target_tierProviderTierplatformverifiedcommunityprivateThe tier the version was submitted for:
verifiedgoes to review by gitmoap;communityandprivateare checked automatically, without review. - versionProviderVersion (string)
attest_resultAttestResult or nulloptionalThe result of checking a community or private provider's images.
- The AttestResult schema
- attested_atstring
- capabilitiesobject
mirror_resultMirrorResult or nulloptional
- The MirrorResult schema
- capabilitiesobject
- mirrored_atstring
- sbom_refstring or nulloptional
- owning_group_idGroupId (string · uuid) or nulloptionalThe organization the provider is private to. Set only when
target_tierisprivate. - published_atstring or nulloptional
- registry_pull_secret_refSsmParameterPath (string) or nulloptionalA reference to the stored credential for pulling images from a private registry, for a private provider that uses one. Never the credential itself.
- review_notesstring or nulloptional
- reviewed_atstring or nulloptional
reviewerActorSummary or nulloptionalThe gitmoap administrator who reviewed the submission, once reviewed.
- The ActorSummary schema
- emailstring
- idstring
- usernamestring
- avatar_urlstring or nulloptional
200 exampleSynthesized example
{
"auth_schema": {},
"manifest": {
"capabilities": [
{
"cache_enabled": false,
"capability_id": "d934640f-2763-4505-aef0-3ef6c1b7c8c5",
"config_schema": {},
"default_timeout_seconds": 56,
"description": "Renders each region as density contours of its operations.",
"image_uri": "https://gitmoap.example/acme/79336b4f",
"inputs": [],
"name": "payments-api",
"outputs": [],
"requires_docker": false,
"stage_type": "source"
}
],
"contract_version": 82,
"manifest_digest": "manifest-digest-5829",
"provider_id": "a35911f7-1d34-4023-be26-4561db7c1edb",
"published_at": "2026-10-09T01:42:38Z",
"published_by": "b7e2d1c0-9f8e-4d7c-a6b5-c4d3e2f1a0b9",
"version": "version-e684",
"changelog": "changelog-e3c6",
"cosign_signature_ref": "cosign-signature-ref-5066",
"lifecycle_state": "active",
"signed": false,
"sunset_at": "2026-10-12T07:09:50Z",
"sunset_enforced_at": "2026-10-17T02:32:01Z"
},
"manifest_digest": "manifest-digest-3276",
"provider_description": "provider-description-3b45",
"provider_id": "562ee845-7216-4de9-bba8-9928f8ee3d73",
"provider_name": "payments-api",
"publisher_id": "7f854b6a-1977-421e-809e-9f7c3e8f4455",
"source_image_refs": {
"source_image_refs": {
"image_digest": "image-digest-40eb",
"image_ref": "image-ref-1e20"
}
},
"state": "submitted",
"submission_id": "e3e22f6e-4772-4f5c-a45a-2bef2edddf16",
"submitted_at": "2026-10-16T13:52:40Z",
"submitted_by": {
"email": "lin@acme.example",
"id": "id-3577",
"username": "mara",
"avatar_url": "https://gitmoap.example/acme/b2960428"
},
"target_tier": "platform",
"version": "version-6c97",
"attest_result": {
"attested_at": "2026-10-16T21:38:04Z",
"capabilities": {
"capabilities": {
"image_digest": "image-digest-ae21",
"image_uri": "https://gitmoap.example/acme/781a7cfb"
}
}
},
"mirror_result": {
"capabilities": {
"capabilities": {
"gitmoap_image_uri": "https://gitmoap.example/acme/e51efd2a",
"image_digest": "image-digest-15aa"
}
},
"mirrored_at": "2026-10-08T11:58:58Z",
"sbom_ref": "sbom-ref-2415"
},
"owning_group_id": "4c1d8e2f-6a3b-4f90-b7c5-1e2d3c4b5a69",
"published_at": "2026-10-09T07:40:59Z",
"registry_pull_secret_ref": "registry-pull-secret-ref-1da8",
"review_notes": "review-notes-92d6",
"reviewed_at": "2026-10-11T16:27:51Z",
"reviewer": {
"email": "tomas@acme.example",
"id": "id-88f6",
"username": "lin",
"avatar_url": "https://gitmoap.example/acme/b1059a00"
}
}
400application/json
Error codes
- BAD_REQUESTThe request is malformed: a parameter or a body field is not a well-formed value of its type
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
400 exampleSynthesized example
{
"error": {
"code": "code-4c2f",
"message": "Stream pipeline status into the run header"
}
}
401Unauthenticated — no credential, or an invalid oneapplication/json
Error codes
- UNAUTHORIZEDNo credential was sent, or the one sent is invalid, expired or revoked
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
401 exampleSynthesized example
{
"error": {
"code": "code-f797",
"message": "Pin a page's payload to the build that rendered it"
}
}
403application/json
Error codes
- FORBIDDENYou are signed in but may not do this here;
reasonnames the permission or the rule that refused it - INSUFFICIENT_SCOPEThe access token lacks the scope this operation needs;
required_scopenames it - PERMISSION_REQUIREDYou need a permission you do not hold here; the message names it
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
403 exampleSynthesized example
{
"error": {
"code": "code-e66b",
"message": "Draw the region map from operation density"
}
}
404application/json
Error codes
- NOT_FOUNDThe resource does not exist — or exists and you cannot see it: a private resource you have no access to answers exactly as an absent one does
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
404 exampleSynthesized example
{
"error": {
"code": "code-5641",
"message": "Label every synthesized example"
}
}
409application/json
Error codes
- CONFLICTThe request conflicts with the resource's current state;
reasonsays how - LEGAL_ACCEPTANCE_REQUIREDAccept the current Terms of Service before changing anything; reading stays open
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
409 exampleSynthesized example
{
"error": {
"code": "code-0a87",
"message": "Draw the region map from operation density"
}
}
CLI
gitmoap provider-admin request-provider-changes
- --submission-ididSubmission id
- --notestringoptional
- --reasonstringoptional