Apply by key
201. A subsequent apply returns 200 with the same
resource ID, including after a rename. externalKey is returned with the resource.
Keys match ^[a-z0-9][a-z0-9._-]{0,127}$ and are immutable while the resource exists.
Choose keys independently from display names and keep them in version control.
Teams, providers, policies, and marketplaces support
GET at the same keyed URL
and at /v1/{resource}/{id}. For MCP connections, read the returned ID at
GET /v1/mcp-connections/{id}. Provider credentials are not returned by these reads.
The new team, provider, and marketplace writes require an organization admin;
policy writes require an owner or super-admin and the applicable plan entitlement.
Existing resource permissions still apply. SCIM-managed teams must be managed by
the identity provider. MCP routes retain their existing permission and credential
restrictions. API keys are bound to their organization and the issuing member’s
permissions; they do not grant extra privileges.
A complete example
The repository includes an executable example with teams, an inference provider, desktop policy assignments, and a marketplace. It also supports an optionalmcpConnections section using the MCP request shape.
Use Node.js 24 or later; no additional packages are needed.
"teams": ["platform"] to refer to a team in the manifest. The example creates
teams first and uses their returned IDs for dependent assignments. Other resource
fields follow the API reference. Put MCP access rules in its access object;
marketplace access and plugin attachments use separate endpoints.
Run the same command twice. The second run should update the existing resources.
Rename a display label and remove an assignment, then run again: the ID stays the
same and the assignment is removed. Resources absent from the file are untouched.
This is resource-level convergence, not a transaction across the entire manifest.
If a later resource fails, earlier writes remain; correct the request and rerun.
Existing resources and conflicts
The API never adopts an existing resource by matching its display name. Existing unkeyed resources remain managed by their IDs. Moving them into keyed management requires a separate, deliberate migration; this API does not bind a key to an existing ID. Teams retain their existing unique-name rule. If a keyed team would use another team’s name, the API returns409; it does not overwrite that team. Providers,
policies, and marketplaces retain their existing duplicate-name behavior. An
archived marketplace retains its key and must be explicitly restored through its
lifecycle endpoint before applying metadata.
A concurrent first apply can return 409; retry the keyed request. The database
prevents two resources from owning the same key. Serialize deployments that write
the same resource: the new four-resource writes use last-write-wins and reject
If-Match and If-None-Match on PUT rather than silently ignoring them. MCP’s
existing optional If-Match behavior remains available. This release does not
provide a universal compare-and-swap contract or guarantee that a no-op apply
leaves timestamps and assignment-row IDs unchanged.
Remove managed resources
DELETE /v1/{resource}/by-key/{key} returns
{"ok":true,"deleted":true} for a removal and
{"ok":true,"deleted":false} if it is already absent. Delete dependents before
teams. Deleting a marketplace removes the marketplace and its relationships,
not the underlying plugins. A policy deletion retains its normal soft-delete
behavior and releases the key. A later apply of a deleted key creates a new ID.
To remove exactly the resources listed in the example manifest:
Scope and compatibility
Existing create, update-by-ID, and delete-by-ID routes keep their request behavior. Responses add the nullableexternalKey field. Existing rows remain unkeyed; the
release does not enforce new display-name uniqueness or rename existing resources.
This workflow covers configuration of five resource types, not every organization
setting. Bootstrap still requires an authenticated administrator to create the
organization and issue an API key. Invitations, access grants, versioned skills,
plugins, automations, member credentials, and organization settings retain their
existing APIs and lifecycle rules. Use their current endpoints alongside this
manifest when required; the script does not claim to provision those resources.