Using providers
- Browse the marketplace
- Filter the marketplace by category
- Read a provider's marketplace page
- Check a provider's credential shape
- Compare a provider's published versions
- Read one published version in full
- See what a provider can do
- Read a capability's ports before you wire it
- Connect a provider once for a whole group
- Override a group's connection for one repository
- List the connections defined on a group or repository
- See which connections a repository actually resolves
- Inspect one connection
- Rotate a connection's credentials
- Delete a connection
- Write the marketplace listing for a provider you publish
Overview
A provider is a step your pipeline can run — cloning a repository, building an image, pushing it to a registry, deploying it, telling a channel it worked. The marketplace is where you find one, read what it does, and see which versions it has published. A connection is how you hand it the credentials it needs to reach your own systems, stored once at the group or repository level and picked up by every pipeline underneath.
The two halves are separate on purpose. Reading the catalog tells you what a provider can do and what shape of credential it wants; creating a connection tells one group or one repository which account to use when it does it. You can browse the whole marketplace without owning anything, and you can hold a dozen named connections for the same provider — one per environment — without a pipeline ever having to guess which is which.
Quick start
Install a provider
Choose Marketplace in the top navigation, and open the provider you need.
Choose Install, and pick the group. It applies to that group and every repository beneath it.
Its capabilities appear in the pipeline editor's palette, ready to drop onto a canvas.
Give a provider its credentials
Start at Providers in the side navigation, on the Credentials tab.
Choose Add connection.
Pick the provider, name the connection —
aws-prod,docker-ci— and fill in its credentials or the role it federates to.Choose Create connection. Every pipeline beneath this scope can use it, and its values are never shown again.
Before you start
- A signed-in identity.Every catalog read needs authentication. There is no anonymous browsing of the marketplace, and the resolution endpoint refuses an anonymous caller even on a public repository.
- Reporter access to read connections, on the group or repository that holds them. Connection reads carry no public-visibility shortcut: a public group's connections are visible to its members and to nobody else, because the field names of a credential describe the shape of your infrastructure.
- Owner access to create, rotate or delete a connection.This is a level above what most repository work needs, and it is deliberate — a connection is the credential a pipeline runs with.
- Token scopes, if you are calling the API or the CLI rather than clicking:
provider_catalog:readfor everything in the marketplace,provider_connection:readto list and inspect connections,provider_connection:manageto create, rotate and delete them, andprovider_publishing:writeto write a marketplace listing for a provider you publish. Scopes are fixed when you mint a token and cannot be widened afterwards. - The credential itself.Every provider publishes the exact fields it expects. Read those before you start rather than guessing — a connection whose credentials do not match is refused at creation, not at run time.
- A private provider needs you to be in the owning organisation.Providers published privately are filtered out of the marketplace for everyone else, and answer
404rather than403, so their existence stays private. - The provider installed on your group, before a pipeline can actually run it. A connection supplies credentials; installing decides whether the provider may run at all and which version it is pinned to. The platform's own providers are installed for you when your organisation is created; every other provider is an explicit decision. See Provider policy and administration.
- An active publisher account owning the provider's namespace, if you are writing a marketplace listing. Only the publisher who owns a provider may edit its listing, and the platform's own providers have theirs maintained alongside the provider itself.
How it works
A provider, a version, a capability, a port
Four nested things, and a pipeline node names the innermost one.
provider aws what you connect credentials to version v0.8.0 an immutable, published release capability aws:ecs-deploy one runnable step, in one stage ports task_definition_arn, deployment the typed inputs and outputs you wireA provider is the unit you trust and connect to. A version is immutable once published — the same version always resolves to the same container image, which is what makes a run reproducible. A capability is a single runnable step, identified as provider:name, and it belongs to a stage: source, build, test, publish, deploy, notify or custom. Ports are its typed inputs and outputs; a pipeline connects one node's output port to another node's input port, and the types have to match exactly. A capability's own settings — the cluster to deploy into, the bucket to write to — are node configuration rather than ports, though a capability may mark some of those keys as bindable, and each of those also shows up as an optional input port so an upstream node can supply the value instead. The credentials port type is where the two halves of this page meet: a credentials input with nothing wired into it is filled from the connection resolved for that node, and only a capability that deliberately emits credentials as an output can feed one over an edge you draw.
Capability reads default to the provider's latest version. Pass version to read the capabilities of an older one, which is what you want when a pipeline is pinned and you are reading the manifest it actually runs.
Some capabilities declare input groups — a set of optional input ports where exactly one, at most one, or at least one may be wired. A capability that deploys from a zip or a container image says so this way, and the editor refuses the impossible combination while you are drawing the pipeline rather than after a run has started.
Where a connection lives, and which one a node gets
A connection is attached to one group or one repository, and it carries a name you choose: aws-prod, aws-staging, docker-ci. A name is unique within a scope across every provider: a group can hold aws-prod and aws-staging side by side, but not two called aws-prod — and not a prod for one provider alongside a prod for another. Naming a connection after the provider it belongs to is what keeps you out of that collision. Resolution then matches on the provider and the name together, so a repository's aws-prod shadows the group's aws-prod and nothing else.
When a pipeline in a repository triggers, connections are gathered from the repository first, then from its parent group, then that group's parent, and so on outwards. The first (provider, name) seen wins:
repository aws / prod ← used parent group aws / prod shadowed by the repository's own grandparent group aws / staging ← used (a different name)That is the whole override model: define a connection once high up, and shadow it lower down by defining the same provider and name closer to the repository.
A pipeline node picks its connection by name. If a node names one, that exact (provider, name) must resolve or the run fails to start. If a node names none, the connection auto-resolves when exactly one connection for that provider is in scope — and refuses when there are two, because guessing between production and staging is the wrong kind of convenience. Having no connection for a provider is not an error: most capabilities need no credential at all, and a run only fails if a step actually tries to use one.
Which connection each node uses is decided once, when the run is created, and does not change for the life of that run. The credential values behind it are read again as each step starts, so a rotation reaches every step that has not started yet, and deleting a connection makes a step that has not started yet fail when it reaches for it. Neither disturbs a step that is already running.
How a connection authenticates
Two modes, chosen at creation and fixed for the life of the connection.
| Mode | What you store | When to use it |
|---|---|---|
static_credentials | The provider's credential fields — an access key, a registry token, a webhook URL | Anything without a federation story, and the default |
oidc_federation | No secret at all: the cloud, the role to assume, and optionally an audience and region | An AWS account where you can create a role that trusts an external identity provider |
A static connection's values are encrypted when written and are never returned by any endpoint. What comes back is the names of the fields the connection holds, so you can see that a credential is present and which fields it covers without the value ever leaving storage again. A federation connection stores no secret whatsoever — the pipeline exchanges a short-lived token for a role at run time. AWS is the cloud a federation target names, and the role is a full IAM role ARN. Federation is only offered by providers that advertise it, and asking for it from one that does not is refused at creation.
Because the mode is fixed, switching a connection from stored keys to federation means creating the new one and deleting the old.
What is recorded
Creating, rotating and deleting a connection are recorded in the audit log as changes, and so is writing a marketplace listing. Reading a single connection, and resolving a repository's connections, are recorded as sensitive reads — listing them is not, and no catalog read is recorded at all. If you are auditing who looked at your credential configuration, those sensitive reads are the entries to look for.
How to
Browse the marketplace
The browse list is the provider grid: name, one-line description, categories, the trust tier, whether the publisher's namespace is verified, and how many organisations have installed it. Narrow it with q for free text over names, descriptions and keywords; with category, tier and verified_only for facets; and with featured for the editorially curated shortlist. owning_group narrows the list to one organisation's private providers, and answers nothing at all to somebody outside that organisation. Sort by relevance, installs, name or recently_updated.
Page size is clamped to 1–100 rather than refused, so a limit outside that range quietly gives you the nearest legal page. The next_token you get back is tied to the filters and the sort that produced it: change either while paging and the token is refused, so re-run the search from the first page after every filter change.
Install counts are omitted for the platform's own providers — they ship with every organisation, so a count would say nothing useful. Their signal is the tier badge instead.
Choose Marketplace in the top navigation. The search box filters as you type; the left rail carries the category, tier and verified filters, and the sort control sits above the grid. Each card shows the provider's badge row — tier, verified namespace, signed image — and its install count. Scroll to load the next page.
gitmoap provider-catalog list-providerscurl -X GET https://api.gitmoap.example/providers \ -H "Authorization: Bearer $GITMOAP_TOKEN"Filter the marketplace by category
Categories are a fixed, curated list — source-control, build, test, quality, security, release, deploy, infrastructure, notify and other — and each comes back with a live count of the providers you can see. A private provider counts only for members of the organisation that owns it, so two people can legitimately see different numbers.
The category rail on the left of the marketplace is this list. Each entry shows its provider count beside the label; choosing one applies it as a filter to the grid.
gitmoap provider-catalog list-marketplace-categoriescurl -X GET https://api.gitmoap.example/marketplace/categories \ -H "Authorization: Bearer $GITMOAP_TOKEN"Read a provider's marketplace page
Before you connect anything to a provider, read its page. It carries the long-form README, the worked examples its publisher wrote, the publisher badge, and the full version history with a changelog and a lifecycle state per version.
Three things on that page are worth reading properly:
- The tier.
platformproviders are built and run by us.verifiedproviders are third-party but reviewed and re-published by us.communityproviders are published directly by their author from the author's own registry.privateproviders belong to one organisation and are invisible outside it. - The lifecycle state of the version you intend to pin.
activeis normal.deprecatedstill runs, with a warning.sunsetruns only inside its grace window, after which a pipeline referencing it fails to start. - The examples. Each names the capabilities it exercises, so an example is also a shortcut to the capability you want.
Choose any card in the marketplace to open the provider page. The README renders in the main column; the version list, publisher badge and links sit in the right rail, and each version expands to show its changelog.
gitmoap provider-catalog get-provider-listing --provider-id <id>curl -X GET https://api.gitmoap.example/providers/{provider_id}/listing \ -H "Authorization: Bearer $GITMOAP_TOKEN"Check a provider's credential shape
The provider record carries the schema for its credentials — the exact field names and types a connection must supply — and the authentication modes it supports. Read this before creating a connection, because credentials are validated against it and a mismatch is refused outright.
The Authentication section of the provider page lists the credential fields the provider expects, which are required, and whether it supports federation as well as stored keys.
gitmoap provider-catalog get-provider --provider-id <id>curl -X GET https://api.gitmoap.example/providers/{provider_id} \ -H "Authorization: Bearer $GITMOAP_TOKEN"Compare a provider's published versions
Versions come back newest-first, each with when it was published, who published it, whether its image is signed, and its lifecycle state. A sunset version also carries the moment it was sunset and the moment its grace window closes — the deadline for moving anything pinned to it. Versions are strict semantic versions with a leading v, like v1.4.0 — there is no floating range and no latest tag to pin to, because a pipeline that silently changes what it runs is not reproducible.
The provider page's right rail lists every published version, newest first, with its lifecycle badge. Choosing one expands its changelog.
gitmoap provider-catalog list-provider-versions --provider-id <id>curl -X GET https://api.gitmoap.example/providers/{provider_id}/versions \ -H "Authorization: Bearer $GITMOAP_TOKEN"Read one published version in full
A single version read returns the whole manifest: every capability at that version, with its ports, its configuration schema, its default timeout, and the exact image build the version resolves to. This is the definitive answer to "what does my pinned version actually run".
On the provider page, choose a version in the right rail and then View manifest to open its full capability list.
gitmoap provider-catalog get-provider-version \ --provider-id <id> \ --version <id>curl -X GET https://api.gitmoap.example/providers/{provider_id}/versions/{version} \ -H "Authorization: Bearer $GITMOAP_TOKEN"See what a provider can do
The capability list for a provider, at its latest version unless you pin one. Filter by stage_type when you know which part of the pipeline you are filling — asking a provider for its deploy capabilities is usually faster than reading all of them.
The Capabilities tab of the provider page groups them by stage. The version selector above the list controls which version's capabilities you are looking at.
gitmoap provider-catalog list-capabilities --provider-id <id>curl -X GET https://api.gitmoap.example/providers/{provider_id}/capabilities \ -H "Authorization: Bearer $GITMOAP_TOKEN"Read a capability's ports before you wire it
A capability read is what you consult while drawing a pipeline. It gives you the ports — each with a name, a type, whether it is required, whether it takes one source or several at once, and a description written by the provider's author saying what to connect to it and what happens if you do not — plus the configuration schema for the node, which configuration keys accept a value produced by another node, and any input groups constraining which optional ports may be used together.
Port types match exactly; there is no coercion. A port named source always carries a git reference, artifact always carries an artifact, and so on across the whole catalog, so two ports that share a name always carry the same type. A port can also name the exact shape it carries — s3.object/v1 on an artifact port, aws.ecs.task-definition-arn/v1 on a custom one, which is how a provider describes a payload the built-in types have no name for. Two ports connect only when both the type and the named shape agree; a port that names no shape takes any payload of its type.
Choose a capability on the provider page to open its detail panel: inputs on the left, outputs on the right, configuration below, with each port's description beside it. The same panel opens from the node inspector while you are editing a pipeline.
gitmoap provider-catalog get-capability --capability-id <id>curl -X GET https://api.gitmoap.example/capabilities/{capability_id} \ -H "Authorization: Bearer $GITMOAP_TOKEN"Connect a provider once for a whole group
This is the usual place to put a connection. A connection on a group is available to every repository and every nested group beneath it, so one aws-prod at the top of your organisation serves everything under it.
Give it a provider_id, a name and the credential fields the provider's schema requires. The name is lowercase letters, digits and hyphens, one to sixty-four characters, no leading or trailing hyphen — aws-prod, docker-ci, registry-eu. Pick the name you want pipeline authors to type, because that is exactly what they will type.
For a connection that stores no secret, set auth_mode to oidc_federation and supply federation_target — the cloud (aws), the IAM role ARN to assume, and optionally the audience and region — with no credentials block at all. The provider has to advertise federation for this to be accepted.
Open the group, choose Settings, then Provider connections, then New connection. Pick the provider, give the connection a name, and choose how it authenticates. Choosing stored credentials renders one field per entry in the provider's credential schema, with required fields marked; choosing federation asks for the role instead. Create saves it and returns you to the list, where the new connection shows its field names but never their values.
gitmoap provider-connections create-group-connection \ --group-id <id> \ --name <name> \ --provider-id <provider id>curl -X POST https://api.gitmoap.example/groups/{group_id}/provider-connections \ -H "Authorization: Bearer $GITMOAP_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "<string>", "provider_id": "<string>" }'Note
The name has to be free within the scope — across every provider, not only this one — and a duplicate is refused rather than overwritten, so you cannot replace somebody's production credential by re-creating it under the same name.
Override a group's connection for one repository
A connection created on a repository shadows any connection with the same provider and name inherited from above. Use it when one repository deploys somewhere the rest of the group does not, or when you want to narrow a single repository's blast radius to a credential of its own.
Everything else — the request shape, the name rules, the two authentication modes — is identical to the group case.
Open the repository, choose Settings, then Provider connections, then New connection. The form is the group form: pick the provider, name the connection, and choose how it authenticates. Giving it the same provider and name as one inherited from above replaces that one for this repository only.
gitmoap provider-connections create-repo-connection \ --repo-id <id> \ --name <name> \ --provider-id <provider id>curl -X POST https://api.gitmoap.example/repositories/{repo_id}/provider-connections \ -H "Authorization: Bearer $GITMOAP_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "<string>", "provider_id": "<string>" }'List the connections defined on a group or repository
Both listings show what is defined directly on that scope, newest first, with nothing inherited folded in. That is the view you want when you are auditing what one group owns, and the wrong view when you are asking what a pipeline will actually get — for that, resolve.
Settings → Provider connections on the group. Each row shows the provider, the connection name, the credential field names it holds, who created it and when it was last rotated.
gitmoap provider-connections list-group-connections --group-id <id>curl -X GET https://api.gitmoap.example/groups/{group_id}/provider-connections \ -H "Authorization: Bearer $GITMOAP_TOKEN"Settings → Provider connections on the repository. This tab holds the connections defined on the repository itself; the Effective tab beside it is where anything inherited from above appears.
gitmoap provider-connections list-repo-connections --repo-id <id>curl -X GET https://api.gitmoap.example/repositories/{repo_id}/provider-connections \ -H "Authorization: Bearer $GITMOAP_TOKEN"See which connections a repository actually resolves
This is the one to reach for when a pipeline cannot find its credentials. It walks the repository and every group above it and returns the merged result — one entry per (provider, name), each marked as inherited or not, and each naming the scope it came from.
Two things it will tell you that a plain listing cannot: whether the connection a node names is reachable from this repository at all, and whether two connections for the same provider exist in scope, which is what turns an unnamed node into an ambiguity error.
An entry inherited from a group you cannot read comes back with its details blanked — the provider and the name survive, because you need to know the connection applies, but the field names, the creator and the source group do not. A row that looks half-empty is that, not a broken connection.
Open the repository, choose Settings, then Provider connections, then Effective. The table shows every connection a pipeline here can use, where each came from, and flags any provider with more than one connection in scope as needing an explicit name in the node.
gitmoap provider-connections resolve-repo-connections --repo-id <id>curl -X GET https://api.gitmoap.example/repositories/{repo_id}/resolved-provider-connections \ -H "Authorization: Bearer $GITMOAP_TOKEN"Inspect one connection
A single-connection read returns the same shape as a listing row, for one connection. Credential values are not part of that shape at any scope — there is no endpoint, flag or role that returns them.
Single reads are recorded in the audit log as sensitive reads.
Choose a row in the group's Provider connections list to open its detail panel.
gitmoap provider-connections get-group-connection \ --group-id <id> \ --connection-id <id>curl -X GET https://api.gitmoap.example/groups/{group_id}/provider-connections/{connection_id} \ -H "Authorization: Bearer $GITMOAP_TOKEN"Choose a row in the repository's Provider connections list to open its detail panel.
gitmoap provider-connections get-repo-connection \ --repo-id <id> \ --connection-id <id>curl -X GET https://api.gitmoap.example/repositories/{repo_id}/provider-connections/{connection_id} \ -H "Authorization: Bearer $GITMOAP_TOKEN"Rotate a connection's credentials
Rotating means sending a fresh, complete credentials object. Fields you send are written over the old values; fields you leave out are removed from the connection. Send the whole set every time, not just the one that changed, or the connection ends up missing the fields you omitted and every pipeline using it starts failing.
The new credentials are validated against the provider's schema first, so a rotation with the wrong field names is refused before anything is overwritten. A successful rotation stamps the connection's last-rotated time. That stamp is empty until the first rotation, so a connection showing nothing there is still running on the credential it was created with — which is what to look for when you are auditing credential age.
You can also update config_overrides without touching credentials — send it alone and the stored secret is untouched.
The authentication mode cannot be changed. Sending credentials to a federation connection, or a federation target to a static one, is refused; create a new connection and delete the old instead. What a federation connection can change is where it points: send a new federation target to move it to a different role, audience or region.
Open the connection from the group's Provider connections list and choose Rotate credentials. The form is pre-populated with the field names the connection holds but never their values, so you re-enter every field. Save replaces them and updates the last-rotated timestamp shown in the list.
gitmoap provider-connections update-group-connection \ --group-id <id> \ --connection-id <id>curl -X PUT https://api.gitmoap.example/groups/{group_id}/provider-connections/{connection_id} \ -H "Authorization: Bearer $GITMOAP_TOKEN"The same Rotate credentials action on a connection defined on the repository. An inherited connection has no rotate action here — rotate it on the group that owns it.
gitmoap provider-connections update-repo-connection \ --repo-id <id> \ --connection-id <id>curl -X PUT https://api.gitmoap.example/repositories/{repo_id}/provider-connections/{connection_id} \ -H "Authorization: Bearer $GITMOAP_TOKEN"Delete a connection
Warning
Deleting a connection destroys the stored credential values immediately and permanently. They cannot be read back before deletion and cannot be recovered after it — if a value was only ever typed into Gitmoap, it is gone, and you will have to mint a new one at the provider. Pipelines are not deleted with it and nothing warns them: the definition stays exactly as saved, and nothing re-checks it until something triggers it — at which point the run fails to start, naming the node and the connection it cannot find. Check the resolved view for the repositories underneath before you delete a connection on a group.
Deleting a repository-level connection that was shadowing an inherited one un-shadows it: the group's connection with the same provider and name starts resolving again on the next trigger. That is usually what you want when you created an override by mistake, and worth checking when you did not.
Deleting is not idempotent — the second delete of the same connection answers 404.
Deleting the group or repository a connection lives on takes its connections with it, credentials included. That is one more thing to weigh before deleting a scope that other people's pipelines run under.
Open the connection from the group's Provider connections list and choose Delete. The confirmation names the provider and the connection it is about to destroy. Nothing below the group is checked on your behalf, so open the Effective view on the repositories that matter first.
gitmoap provider-connections delete-group-connection \ --group-id <id> \ --connection-id <id>curl -X DELETE https://api.gitmoap.example/groups/{group_id}/provider-connections/{connection_id} \ -H "Authorization: Bearer $GITMOAP_TOKEN"The same Delete action on a connection defined on the repository. Afterwards the Effective view is where you see whether an inherited connection of the same name has taken its place.
gitmoap provider-connections delete-repo-connection \ --repo-id <id> \ --connection-id <id>curl -X DELETE https://api.gitmoap.example/repositories/{repo_id}/provider-connections/{connection_id} \ -H "Authorization: Bearer $GITMOAP_TOKEN"Write the marketplace listing for a provider you publish
If you publish a provider, its listing is the page everyone else reads — the README, the categories it appears under, the search keywords, the homepage and repository links, and the worked examples. It is editable independently of your versions, so fixing a typo in the README does not mean publishing a release.
The enforced shape: one to three categories, at most ten keywords, and at most ten examples, each with a title of at most 120 characters, a description of at most 500, and a snippet of at most 8 KB. A keyword is 1 to 31 characters of lowercase letters, digits and hyphens, and cannot open with a hyphen. The README is at most 128 KB, and the homepage and repository links have to be https://. Every capability an example names has to exist in one of your published versions, which is checked when you save.
Fields you leave out are unchanged; sending an explicit null clears one. You have to own the provider's namespace as an active publisher; the platform's own providers have their listings maintained with the provider itself and refuse this call.
Open your provider from Publishing → My providers and choose Edit listing. The README editor previews as you type; categories, keywords and links sit beside it, and examples are added one at a time with a capability picker that only offers capabilities you have actually published. Publish listing takes effect immediately — no version is created.
gitmoap provider-catalog set-provider-listing --provider-id <id>curl -X PUT https://api.gitmoap.example/providers/{provider_id}/listing \ -H "Authorization: Bearer $GITMOAP_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "examples[].description": "<string>", "examples[].snippet": "<string>", "examples[].title": "<string>" }'Reference
The marketplace and catalog reads:
9 endpoints
GET/providersprovider_catalog:read
Browse the provider marketplace.
Token scope
provider_catalog:read
Send
Query
- qstringoptionalFree-text match over name/description/keywords
- categorybuilddeployinfrastructurenotifyotherqualityreleasesecuritysource-controltestoptionalFilter to providers declaring this category
- tiercommunityplatformprivateverifiedoptionalFilter by tier
- verified_onlybooleanoptionalOnly providers whose publisher namespace is verified
- featuredbooleanoptionalOnly editorially-featured providers, ordered by rank
- owning_groupuuidoptionalList one org's private providers (members only)
- sortinstallsnamerecently_updatedrelevanceoptionalrelevance | installs | name | recently_updated
- limitint32optionalPage size (1-100, default 20)
- next_tokenstringoptionalOpaque pagination cursor
Refuses
400Invalid filter / sort / pagination params401403Forbidden — the caller's access level or token scope is insufficient
Receive
items[]object14 fields
- created_atstring
- descriptionstring
- featured_rankint32optionalWhere gitmoap features the provider: lower numbers are placed higher. Absent when it is not featured.
- idstring
- install_countint64optionalHow many organizations have installed the provider. Absent for providers gitmoap builds itself.
- latest_versionobjectoptional
- lifecycle_stateobjectoptional
- namestring
- namespace_verifiedbooleanWhether the provider's publisher has verified its namespace.
falsefor providers gitmoap builds itself, which have no publisher. - publisher_idobjectoptional
- signedbooleanWhether the latest version's images are signed by gitmoap, as platform and verified providers' are.
- tiercommunityplatformprivateverifiedHow a pipeline provider is distributed and how much it is vouched for.
- updated_atstring
- visibilityobjectWho can see a provider in the catalog.
publicis listed for everyone;privateis listed only for members of the organisation that owns it.
- next_tokenobjectoptional
GET/marketplace/categoriesprovider_catalog:read
List the marketplace category taxonomy with live provider counts.
Token scope
provider_catalog:read
Send
Nothing — the address is the whole request.
Refuses
401403Forbidden — the caller's access level or token scope is insufficient
Receive
items[]object3 fields
- categorybuilddeployinfrastructurenotifyotherqualityreleasesecuritysource-controltestA marketplace discovery category a provider is listed under. A provider declares one to three,
and they describe where it appears when browsing, not what its capabilities do — a provider in
infrastructuremay still offer build and deploy capabilities. - labelstring
- provider_countint64
- categorybuilddeployinfrastructurenotifyotherqualityreleasesecuritysource-controltestA marketplace discovery category a provider is listed under. A provider declares one to three,
and they describe where it appears when browsing, not what its capabilities do — a provider in
GET/providers/{provider_id}provider_catalog:read
Get one provider's metadata.
Token scope
provider_catalog:read
Send
Path
- provider_idstringProvider slug
Refuses
400401403Forbidden — the caller's access level or token scope is insufficient404
Receive
- auth_schemaobjectThe JSON Schema a connection's credentials must satisfy, exactly as the provider's
gitmoap-provider.yamldeclares it. - created_atstring
- descriptionstring
- featured_rankint32optionalWhere gitmoap features the provider: lower numbers are placed higher. Absent when it is not featured.
- idstring
- install_countint64optionalHow many organizations have installed the provider. Providers installed by default are not counted.
- latest_versionobjectoptional
- namestring
- publisher_idobjectoptional
- tiercommunityplatformprivateverifiedHow a pipeline provider is distributed and how much it is vouched for.
- updated_atstring
- visibilityobjectoptionalWho can see a provider in the catalog.
publicis listed for everyone;privateis listed only for members of the organisation that owns it.
GET/providers/{provider_id}/listingprovider_catalog:read
A provider's marketplace page.
Token scope
provider_catalog:read
Send
Path
- provider_idstringProvider slug
Refuses
400401403Forbidden — the caller's access level or token scope is insufficient404
Receive
examples[]object3 fields
- descriptionstringOne- or two-sentence summary (<= 500 chars).
- snippetstringA pipeline YAML/JSON fragment (<= 8 KB).
- titlestringShort heading (<= 120 chars).
- homepage_urlobjectoptional
- install_countint64optional
- namespace_verifiedboolean
providerobject14 fields
- created_atstring
- descriptionstring
- featured_rankint32optionalWhere gitmoap features the provider: lower numbers are placed higher. Absent when it is not featured.
- idstring
- install_countint64optionalHow many organizations have installed the provider. Absent for providers gitmoap builds itself.
- latest_versionobjectoptional
- lifecycle_stateobjectoptional
- namestring
- namespace_verifiedbooleanWhether the provider's publisher has verified its namespace.
falsefor providers gitmoap builds itself, which have no publisher. - publisher_idobjectoptional
- signedbooleanWhether the latest version's images are signed by gitmoap, as platform and verified providers' are.
- tiercommunityplatformprivateverifiedHow a pipeline provider is distributed and how much it is vouched for.
- updated_atstring
- visibilityobjectWho can see a provider in the catalog.
publicis listed for everyone;privateis listed only for members of the organisation that owns it.
- publisherobjectoptional
- readmeobjectoptional
- repository_urlobjectoptional
versions[]object1 field
- changelogobjectoptional
PUT/providers/{provider_id}/listingprovider_publishing:write
Set the marketplace listing for a provider you own
Token scope
provider_publishing:write
Send
Path
- provider_idstringProvider slug
Body
examples[]object3 fields
- descriptionstringOne- or two-sentence summary (<= 500 chars).
- snippetstringA pipeline YAML/JSON fragment (<= 8 KB).
- titlestringShort heading (<= 120 chars).
- homepage_urlobjectoptional
- readmeobjectoptional
- repository_urlobjectoptional
Refuses
400401403404409The request conflicts with the resource's current state; `reason` says how
Receive
The same shape get_provider_listing returns — 9 fields. Go to it
Show it here
examples[]object3 fields
- descriptionstringOne- or two-sentence summary (<= 500 chars).
- snippetstringA pipeline YAML/JSON fragment (<= 8 KB).
- titlestringShort heading (<= 120 chars).
- homepage_urlobjectoptional
- install_countint64optional
- namespace_verifiedboolean
providerobject14 fields
- created_atstring
- descriptionstring
- featured_rankint32optionalWhere gitmoap features the provider: lower numbers are placed higher. Absent when it is not featured.
- idstring
- install_countint64optionalHow many organizations have installed the provider. Absent for providers gitmoap builds itself.
- latest_versionobjectoptional
- lifecycle_stateobjectoptional
- namestring
- namespace_verifiedbooleanWhether the provider's publisher has verified its namespace.
falsefor providers gitmoap builds itself, which have no publisher. - publisher_idobjectoptional
- signedbooleanWhether the latest version's images are signed by gitmoap, as platform and verified providers' are.
- tiercommunityplatformprivateverifiedHow a pipeline provider is distributed and how much it is vouched for.
- updated_atstring
- visibilityobjectWho can see a provider in the catalog.
publicis listed for everyone;privateis listed only for members of the organisation that owns it.
- publisherobjectoptional
- readmeobjectoptional
- repository_urlobjectoptional
versions[]object1 field
- changelogobjectoptional
GET/providers/{provider_id}/versionsprovider_catalog:read
List all published versions of a provider, newest-first.
Token scope
provider_catalog:read
Send
Path
- provider_idstringProvider slug
Query
- limitint32optionalPage size (1-100, default 20)
- next_tokenstringoptionalOpaque pagination cursor
Refuses
400401403Forbidden — the caller's access level or token scope is insufficient404
Receive
items[]object12 fields
- changelogobjectoptional
- contract_versionint32
- cosign_signature_refobjectoptionalWhere the cosign signature is stored in the registry, when the images are signed.
- lifecycle_stateactivedeprecatedsunsetoptionalLifecycle state of a published
ProviderVersionManifest.Activeis the default;Deprecatedstill runs but the trigger-time validator surfaces a warning;Sunsetruns only inside its grace window, after which a trigger referencing it fails validation. - manifest_digeststringThe SHA-256 digest of the version's
gitmoap-provider.yaml. May be empty. - provider_idstring
- published_atstring
- published_bystring
"platform"for platform-authored providers; a publisher id otherwise. - signedbooleanoptionalWhether the version's images are signed with gitmoap's cosign key, as verified and platform providers' are.
- sunset_atobjectoptionalWhen the version was sunset. Set only for a sunset version.
- sunset_enforced_atobjectoptionalWhen the sunset's grace period ends. After it, a run that uses the version fails to start.
- versionstring
- next_tokenobjectoptional
GET/providers/{provider_id}/versions/{version}provider_catalog:read
Get one version manifest (provider + all capabilities at that version).
Token scope
provider_catalog:read
Send
Path
- provider_idstringProvider slug
- versionstringSemVer (vX.Y.Z)
Refuses
400401403Forbidden — the caller's access level or token scope is insufficient404
Receive
capabilities[]object11 fields
- cache_enabledboolean
- capability_idstring
- config_schemaobjectThe JSON Schema a step's
configmust satisfy to use this capability. - default_timeout_secondsint32
- descriptionstring
- image_digestobjectoptionalThe 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.
- image_uristringThe container image that runs the capability, with an immutable version tag.
- namestring
- requires_dockerboolean
- source_image_refobjectoptionalFor a verified provider, the image's location in its publisher's registry before gitmoap copied it. Absent for providers gitmoap builds itself.
- stage_typebuildcustomdeploynotifypublishsourcetestThe pipeline stage a capability belongs to. Maps verbatim to the
stage_typefield of a capability ingitmoap-provider.yaml.
- changelogobjectoptional
- contract_versionint32
- cosign_signature_refobjectoptionalWhere the cosign signature is stored in the registry, when the images are signed.
- lifecycle_stateactivedeprecatedsunsetoptionalLifecycle state of a published
ProviderVersionManifest.Activeis the default;Deprecatedstill runs but the trigger-time validator surfaces a warning;Sunsetruns only inside its grace window, after which a trigger referencing it fails validation. - manifest_digeststringThe SHA-256 digest of the version's
gitmoap-provider.yaml. May be empty. - provider_idstring
- published_atstring
- published_bystring
"platform"for platform-authored providers; a publisher id otherwise. - signedbooleanoptionalWhether the version's images are signed with gitmoap's cosign key, as verified and platform providers' are.
- sunset_atobjectoptionalWhen the version was sunset. Set only for a sunset version.
- sunset_enforced_atobjectoptionalWhen the sunset's grace period ends. After it, a run that uses the version fails to start.
- versionstring
GET/providers/{provider_id}/capabilitiesprovider_catalog:read
List capabilities offered by a provider at its latest (or pinned) version.
Token scope
provider_catalog:read
Send
Path
- provider_idstringProvider slug
Query
- stage_typebuildcustomdeploynotifypublishsourcetestoptionalFilter by stage type
- versionstringoptionalPin to a version (default: latest)
Refuses
400401403Forbidden — the caller's access level or token scope is insufficient404
Receive
items[]object11 fields
- cache_enabledboolean
- capability_idstring
- config_schemaobjectThe JSON Schema a step's
configmust satisfy to use this capability. - default_timeout_secondsint32
- descriptionstring
- image_digestobjectoptionalThe 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.
- image_uristringThe container image that runs the capability, with an immutable version tag.
- namestring
- requires_dockerboolean
- source_image_refobjectoptionalFor a verified provider, the image's location in its publisher's registry before gitmoap copied it. Absent for providers gitmoap builds itself.
- stage_typebuildcustomdeploynotifypublishsourcetestThe pipeline stage a capability belongs to. Maps verbatim to the
stage_typefield of a capability ingitmoap-provider.yaml.
- versionstring
GET/capabilities/{capability_id}provider_catalog:read
Get a single capability's metadata at the provider's latest (or pinned) version.
Token scope
provider_catalog:read
Send
Path
- capability_idstringCapability id (provider:name)
Query
- versionstringoptionalPin to a version (default: latest)
Refuses
400401403Forbidden — the caller's access level or token scope is insufficient404
Receive
No body.
Connections on a group:
5 endpoints
GET/groups/{group_id}/provider-connectionsprovider_connection:read
List a group's provider connections
Token scope
provider_connection:read
Send
Path
- group_iduuidGroup id
Query
- limitint32optionalPage size (1-100, default 20)
- next_tokenstringoptionalOpaque pagination cursor
Refuses
400Bad request — a path parameter is not a well-formed value of its type401403404
Receive
items[]object15 fields
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- created_atstring
created_byobject4 fields
- avatar_urlobjectoptional
- emailstring
- idstring
- usernamestring
- federation_targetobjectoptional
- iduuid
- last_rotated_atobjectoptional
- namestring
- provider_idstring
- scope_idstring
- scope_typegrouprepository
- secret_refsobjectThe names of the stored credential fields, each with a reference to where it is stored.
Never the values. Empty for an
oidc_federationconnection.
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
- next_tokenobjectoptional
POST/groups/{group_id}/provider-connectionsprovider_connection:manage
Create a provider connection for a group
Token scope
provider_connection:manage
Counts against
provider_connections_per_scope
Send
Path
- group_iduuidGroup id
Body
- auth_modeoidc_federationstatic_credentialsoptionalHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- credentialsobjectoptionalThe provider's credentials, in the shape its
auth_schemadescribes. Required forstatic_credentials; refused foroidc_federation. - federation_targetobjectoptional
- namestring
- provider_idstring
Refuses
400401403404409422Credentials supplied for an OIDC-federation connection429Provider-connection limit reached for this group501Provider connections are not configured on this deployment
Receive
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- created_atstring
created_byobject4 fields
- avatar_urlobjectoptional
- emailstring
- idstring
- usernamestring
- federation_targetobjectoptional
- iduuid
- last_rotated_atobjectoptional
- namestring
- provider_idstring
- scope_idstring
- scope_typegrouprepository
- secret_refsobjectThe names of the stored credential fields, each with a reference to where it is stored.
Never the values. Empty for an
oidc_federationconnection.
GET/groups/{group_id}/provider-connections/{connection_id}provider_connection:read
Get one of a group's provider connections
get_group_connectionGET /groups/{group_id}/provider-connections/{connection_id}Open in the API referenceToken scope
provider_connection:read
Send
Path
- group_iduuidGroup id
- connection_iduuidConnection id
Refuses
400Bad request — a path parameter is not a well-formed value of its type401403404
Receive
The same shape create_group_connection returns — 12 fields. Go to it
Show it here
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- created_atstring
created_byobject4 fields
- avatar_urlobjectoptional
- emailstring
- idstring
- usernamestring
- federation_targetobjectoptional
- iduuid
- last_rotated_atobjectoptional
- namestring
- provider_idstring
- scope_idstring
- scope_typegrouprepository
- secret_refsobjectThe names of the stored credential fields, each with a reference to where it is stored.
Never the values. Empty for an
oidc_federationconnection.
PUT/groups/{group_id}/provider-connections/{connection_id}provider_connection:manage
Update a group's provider connection
update_group_connectionPUT /groups/{group_id}/provider-connections/{connection_id}Open in the API referenceToken scope
provider_connection:manage
Send
Path
- group_iduuidGroup id
- connection_iduuidConnection id
Body
- config_overridesobjectoptional
- credentialsobjectoptional
- federation_targetobjectoptional
Refuses
400401403404409The request conflicts with the resource's current state; `reason` says how422Credentials on an OIDC-federation connection, or a federation target on a static-credentials one501Provider connections are not configured on this deployment
Receive
The same shape create_group_connection returns — 12 fields. Go to it
Show it here
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- created_atstring
created_byobject4 fields
- avatar_urlobjectoptional
- emailstring
- idstring
- usernamestring
- federation_targetobjectoptional
- iduuid
- last_rotated_atobjectoptional
- namestring
- provider_idstring
- scope_idstring
- scope_typegrouprepository
- secret_refsobjectThe names of the stored credential fields, each with a reference to where it is stored.
Never the values. Empty for an
oidc_federationconnection.
DELETE/groups/{group_id}/provider-connections/{connection_id}provider_connection:manage
Delete a group's provider connection
delete_group_connectionDELETE /groups/{group_id}/provider-connections/{connection_id}Open in the API referenceToken scope
provider_connection:manage
Send
Path
- group_iduuidGroup id
- connection_iduuidConnection id
Refuses
400Bad request — a path parameter is not a well-formed value of its type401403404409The request conflicts with the resource's current state; `reason` says how501Provider connections are not configured on this deployment
Receive
No body.
Connections on a repository, and the resolved view:
6 endpoints
GET/repositories/{repo_id}/provider-connectionsprovider_connection:read
List a repository's provider connections
Token scope
provider_connection:read
Send
Path
- repo_iduuidRepository id
Query
- limitint32optionalPage size (1-100, default 20)
- next_tokenstringoptionalOpaque pagination cursor
Refuses
400Bad request — a path parameter is not a well-formed value of its type401403404
Receive
The same shape list_group_connections returns — 2 fields. Go to it
Show it here
items[]object15 fields
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- created_atstring
created_byobject4 fields
- avatar_urlobjectoptional
- emailstring
- idstring
- usernamestring
- federation_targetobjectoptional
- iduuid
- last_rotated_atobjectoptional
- namestring
- provider_idstring
- scope_idstring
- scope_typegrouprepository
- secret_refsobjectThe names of the stored credential fields, each with a reference to where it is stored.
Never the values. Empty for an
oidc_federationconnection.
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
- next_tokenobjectoptional
POST/repositories/{repo_id}/provider-connectionsprovider_connection:manage
Create a provider connection for a repository
Token scope
provider_connection:manage
Counts against
provider_connections_per_scope
Send
Path
- repo_iduuidRepository id
Body
- auth_modeoidc_federationstatic_credentialsoptionalHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- credentialsobjectoptionalThe provider's credentials, in the shape its
auth_schemadescribes. Required forstatic_credentials; refused foroidc_federation. - federation_targetobjectoptional
- namestring
- provider_idstring
Refuses
400401403404409422Credentials supplied for an OIDC-federation connection429Provider-connection limit reached for this repository501Provider connections are not configured on this deployment
Receive
The same shape create_group_connection returns — 12 fields. Go to it
Show it here
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- created_atstring
created_byobject4 fields
- avatar_urlobjectoptional
- emailstring
- idstring
- usernamestring
- federation_targetobjectoptional
- iduuid
- last_rotated_atobjectoptional
- namestring
- provider_idstring
- scope_idstring
- scope_typegrouprepository
- secret_refsobjectThe names of the stored credential fields, each with a reference to where it is stored.
Never the values. Empty for an
oidc_federationconnection.
GET/repositories/{repo_id}/provider-connections/{connection_id}provider_connection:read
Get one of a repository's provider connections
get_repo_connectionGET /repositories/{repo_id}/provider-connections/{connection_id}Open in the API referenceToken scope
provider_connection:read
Send
Path
- repo_iduuidRepository id
- connection_iduuidConnection id
Refuses
400Bad request — a path parameter is not a well-formed value of its type401403404
Receive
The same shape create_group_connection returns — 12 fields. Go to it
Show it here
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- created_atstring
created_byobject4 fields
- avatar_urlobjectoptional
- emailstring
- idstring
- usernamestring
- federation_targetobjectoptional
- iduuid
- last_rotated_atobjectoptional
- namestring
- provider_idstring
- scope_idstring
- scope_typegrouprepository
- secret_refsobjectThe names of the stored credential fields, each with a reference to where it is stored.
Never the values. Empty for an
oidc_federationconnection.
PUT/repositories/{repo_id}/provider-connections/{connection_id}provider_connection:manage
Update a repository's provider connection
update_repo_connectionPUT /repositories/{repo_id}/provider-connections/{connection_id}Open in the API referenceToken scope
provider_connection:manage
Send
Path
- repo_iduuidRepository id
- connection_iduuidConnection id
Body
- config_overridesobjectoptional
- credentialsobjectoptional
- federation_targetobjectoptional
Refuses
400401403404409The request conflicts with the resource's current state; `reason` says how422Credentials on an OIDC-federation connection, or a federation target on a static-credentials one501Provider connections are not configured on this deployment
Receive
The same shape create_group_connection returns — 12 fields. Go to it
Show it here
- auth_modeoidc_federationstatic_credentialsHow a connection authenticates to its provider's cloud:
static_credentials(stored credentials, the default) oroidc_federation(nothing stored; each run assumes a cloud role with a short-lived identity token gitmoap issues). - config_overridesobjectoptional
- created_atstring
created_byobject4 fields
- avatar_urlobjectoptional
- emailstring
- idstring
- usernamestring
- federation_targetobjectoptional
- iduuid
- last_rotated_atobjectoptional
- namestring
- provider_idstring
- scope_idstring
- scope_typegrouprepository
- secret_refsobjectThe names of the stored credential fields, each with a reference to where it is stored.
Never the values. Empty for an
oidc_federationconnection.
DELETE/repositories/{repo_id}/provider-connections/{connection_id}provider_connection:manage
Delete a repository's provider connection
delete_repo_connectionDELETE /repositories/{repo_id}/provider-connections/{connection_id}Open in the API referenceToken scope
provider_connection:manage
Send
Path
- repo_iduuidRepository id
- connection_iduuidConnection id
Refuses
400Bad request — a path parameter is not a well-formed value of its type401403404409The request conflicts with the resource's current state; `reason` says how501Provider connections are not configured on this deployment
Receive
No body.
GET/repositories/{repo_id}/resolved-provider-connectionsprovider_connection:read
List the provider connections a repository's pipelines can use
resolve_repo_connectionsGET /repositories/{repo_id}/resolved-provider-connectionsOpen in the API referenceToken scope
provider_connection:read
Send
Path
- repo_iduuidRepository id
Refuses
400Bad request — a path parameter is not a well-formed value of its type401403404
Receive
No body.
Limits
Connections are capped per scope, and a group and a repository each get their own allowance — a group at its cap does not stop a repository underneath it from holding its own.
| Plan | Connections per group or repository |
|---|---|
| Free | 25 |
| Pro | 100 |
| Team | 300 |
| Enterprise | 1 000 |
At the cap, creating another connection is refused with 429 TOO_MANY_REQUESTS. Nothing half-exists afterwards: no connection appears in the list, the credentials you sent are not kept, and the connections you already have are untouched. Deleting a connection frees a slot immediately.
Reading the marketplace is not capped, and neither is rotating a connection you already hold — only creating a new one counts against the number.
If you need more, an Owner can request a limit increase for the namespace, which raises this single number without changing your plan. Increases are granted up to a ceiling of 10 000 connections per scope. The group's limits view shows the effective number and how many of them you have used, which is the same number enforcement checks, so the two can never disagree.
Troubleshooting
400 BAD_REQUESTmentioning a provider or capability id
- Cause
- The id is not well formed — a provider is lowercase letters, digits and hyphens, with one optional
.before the name for a third-party provider (acme.deploy), and a capability id is a provider id, a colon, then the capability name (aws:ecs-deploy) - What to do
- Copy the id from the provider page rather than typing it. A capability id always contains exactly one colon, and the part before it is the provider's own id
400 BAD_REQUESTmentioning a version
- Cause
- The version is not a strict semantic version with a leading
v - What to do
- Use the exact form
v1.4.0. Ranges,latest, and a missingvare all rejected — pin an exact version from the version list
400 BAD_REQUESTon browse, mentioning a filter or sort
- Cause
- A
category,tierorsortvalue outside the fixed set, or anowning_groupthat is not a well-formed id - What to do
- Take category values from the category list and sort from
relevance,installs,name,recently_updated. Page size is clamped rather than refused, so it is never the cause
400 BAD_REQUESTon browse, about the next_token
- Cause
- The cursor was minted under different filters or a different sort from the ones on this request
- What to do
- Start again from the first page whenever you change a filter or the sort. A cursor is only valid for the search that produced it
400 BAD_REQUESTon create or rotate, listing credential fields
- Cause
- The credentials do not match the provider's declared schema — a missing required field, a misspelled name, or an extra field the provider does not accept
- What to do
- Read the provider's credential fields, then send exactly those. The message names the offending field path
400 BAD_REQUESTsaying credentials are required
- Cause
- The create request left out the
credentialsblock. Stored credentials are the default mode, so omitting the mode does not make the credentials optional - What to do
- Send the credential fields the provider declares, or set the authentication mode to federation if the provider supports it
400 BAD_REQUESTsaying the provider does not support federation
- Cause
- The provider only accepts stored credentials
- What to do
- Create the connection with stored credentials instead. The provider record lists the modes it accepts
400 BAD_REQUESTsaying a federation target is required
- Cause
- Federation was requested with no target, or with a target that names no cloud or no role
- What to do
- Supply the target with
awsas the cloud and the full IAM role ARN. Cloud authentication from a pipeline has the role and trust policy to create first
400 BAD_REQUESTon a listing, about categories, keywords, links or examples
- Cause
- Zero or more than three categories; more than ten keywords, or one carrying anything but lowercase letters, digits and hyphens; a link that is not
https://; a README over 128 KB; more than ten examples, an over-long title, description or snippet, or an example naming a capability that is not in any published version - What to do
- Trim to the shape above; for the example, name only capability ids that appear in a version you have already published
401 UNAUTHORIZEDon a marketplace read
- Cause
- There is no valid credential on the request. The catalog has no anonymous access, and neither does connection resolution, even on a public repository
- What to do
- Sign in, or attach a token. If you are calling from a script, check the token has not expired
403 FORBIDDENon create, rotate or delete of a connection
- Cause
- You have access to the group or repository but not Owner. Managing credentials is the highest bar in the model
- What to do
- Ask an Owner to make the change, or to raise your access level. Reading connections needs only Reporter
403 FORBIDDENon a connection listing where the marketplace works
- Cause
- Connection reads need real membership at Reporter or above; a public or internal group does not grant them to non-members
- What to do
- Ask to be added to the group or repository. The marketplace being readable is not evidence that its connections are
403 INSUFFICIENT_SCOPE
- Cause
- The token is valid but was minted without the scope this call needs
- What to do
- Mint a new token carrying
provider_catalog:read,provider_connection:read,provider_connection:manageorprovider_publishing:writeas appropriate. Scopes cannot be added to a token after it exists
403 FORBIDDENon a listing write
- Cause
- You are not a registered publisher, your publisher account is suspended, you do not own this provider, or it is one of the platform's own — those carry no publisher and their listings are maintained alongside the provider
- What to do
- Register as a publisher and publish under a namespace you own; see Publishing a provider. A platform provider's listing is not yours to edit
404 NOT_FOUNDon a provider you can see in a search engine
- Cause
- The provider is published privately to another organisation, or the slug is wrong
- What to do
- Private providers answer
404to non-members so their existence stays private. Check the spelling; if a colleague can see it and you cannot, ask to be added to the owning organisation
404 NOT_FOUNDon a version or capability
- Cause
- The version is not published, or the capability does not exist at the version you pinned
- What to do
- List the versions and read the one you pinned. A capability can be added in a later version and be genuinely absent from an earlier one
404 NOT_FOUNDon a connection you just created
- Cause
- The connection id belongs to a different scope — a repository connection addressed through its group, or the other way round
- What to do
- Address a connection through the scope that owns it. The resolved view names the scope for each one
404 NOT_FOUNDlisting the connections of a group or repository you know exists
- Cause
- The group or repository is private and you are not a member; a private resource answers
404rather than403so that its existence stays private - What to do
- Ask an Owner to add you at Reporter or above. If you are already a member, check the id — a path pasted where an id belongs fails the same way
409 CONFLICTon create
- Cause
- A connection with that name already exists at this scope. Names are unique per scope across every provider, so an existing
prodbelonging to a different provider collides too - What to do
- Pick another name — prefixing it with the provider, as in
aws-prodordocker-ci, keeps it clear of the others — or rotate the existing connection if replacing its credentials is what you meant. The existing connection is left exactly as it was
422 UNPROCESSABLE_ENTITYmentioning credentials and federation
- Cause
- On a create, a credential block was sent alongside federation, which stores no secret. On a rotation, credentials were sent to a federation connection or a federation target to one that stores credentials — the authentication mode is fixed at creation
- What to do
- On a create, drop the credential fields and send the federation target alone. On a rotation, create a connection in the mode you want and delete the old one; nothing about the existing connection was changed
429 TOO_MANY_REQUESTSon create
- Cause
- The scope is at its connection cap
- What to do
- Delete a connection you no longer use, or ask an Owner to request a limit increase. Nothing was created and the values you sent were discarded
501 NOT_IMPLEMENTEDon create, rotate or delete
- Cause
- Credential storage is unavailable on Gitmoap's side. Reads still work; every connection write is refused
- What to do
- Contact support@gitmoap.com. Providers that need no credentials still run in the meantime
A run fails to start saying the connection is ambiguous
- Cause
- Two connections for the same provider resolve for this repository and the node names neither
- What to do
- Name the connection on the node, or delete the one you do not want in scope. The resolved view shows both and where each comes from
A run fails to start saying a connection is missing
- Cause
- The node names a connection that no longer resolves — deleted, renamed, or defined on a scope this repository is not under
- What to do
- Check the resolved view for this repository. Recreate the connection with the exact name the node uses, or edit the node to name one that resolves
A rotation silently dropped a credential field
- Cause
- Rotation replaces the whole credential set: fields left out of the request are removed
- What to do
- Send every field the provider requires on every rotation, not only the one that changed. Rotate again with the complete set to repair it
A connection in the resolved view has no field names, creator or source
- Cause
- It is inherited from a group you cannot read, so its details are withheld while the connection itself still applies here
- What to do
- Nothing is broken. If you need the detail, ask for membership of the group that owns it
A run in progress kept using the old credential
- Cause
- That step had already started. A step reads the credential as it starts, so only steps that have not started yet pick up a rotation
- What to do
- Cancel the run if the old credential has to stop being used now, then trigger again. In a run whose connection you deleted, the steps that have not started yet fail rather than run with the old value
A pipeline pinned to a version starts warning, then fails
- Cause
- The version was deprecated, then sunset past its grace window
- What to do
- Read the changelog on the provider page, then move the pin to an active version
A provider you installed does not appear for one repository
- Cause
- A provider is installed on a group, and an install is a separate thing from a connection — the org's policy on which tiers it accepts is a third
- What to do
- Check the install and the tier policy on the group as well as the connection, in Provider policy and administration
FAQ
Can I read a credential back?
No. Values are write-only at every level — no endpoint returns them, and no role grants it. What you can read is the set of field names a connection holds, so you can confirm a credential is present and complete. Store the value where you minted it.
How many connections should one provider have?
One per distinct account or environment. Two named aws-prod and aws-staging are clearer than one that changes meaning by repository, and naming them explicitly on the node is what makes a deploy pipeline readable.
Should the connection go on the group or the repository?
The group, unless one repository genuinely needs different credentials. A group connection is defined once and inherited everywhere below it; a repository connection is an override, and overrides are easiest to reason about when there are few of them.
What happens to pipelines when I delete a provider's connection?
Nothing immediately — the definitions are untouched and stay exactly as saved. The next trigger is what finds out: a node that named the connection by name fails the run before it starts, with a message naming the node and the connection.
Does browsing the marketplace tell anyone anything?
Catalog reads are not written to your audit log. Reading a single connection, and resolving a repository's connections, are.
Related
- Pipelinesdefining the pipeline whose nodes use these capabilities, and triggering it
- Cloud authentication from a pipelinesetting up the role a federation connection assumes, so a deploy needs no stored key
- Provider policy and administrationinstalling a provider into a group, pinning its version, and deciding which tiers your organisation accepts
- Publishing a providerbecoming a publisher and submitting a version of your own
- Pipeline componentspackaging several provider steps as one reusable, versioned unit
- Access tokensminting a token carrying only the provider scopes a script needs
- Billing and plansthe plan a connection cap comes from, and asking for a limit increase