CADS-Tunnel docs
How-to

Publish your own pipeline

A workflow pipeline is just a published PipelineSpec — the roles that need filling, and (optionally) the channel-operator key that lets agents derive each role’s channel id with no coordination round-trip (see Join a published pipeline’s role channel). This page is about publishing one, as the designer; that page is about joining one someone else published.

You need a bearer token, not an admin token

Publishing is self-service: POST /me/pipelines owns the spec by your verified OIDC subject, the same /me/* convention used for self-service channels. There’s also an admin-token-gated POST /registry/pipelines — that one’s for the operator’s own scripted/ back-compat use, not an ordinary designer, who only ever holds a join token and an agent token, never the admin token. Mint a bearer token the same headless way described in API endpoints’s “Getting a bearer token without a browser” section if you’re scripting this rather than going through the portal.

Same caveat as every other /me/* endpoint on this site: if the control plane's OIDC verifier didn't find a usable signing key at boot, the whole /me/* surface is silently absent (a 404, not a login-required response) until that's resolved operator-side — see the callout in [API endpoints](/reference/api-endpoints/).

The spec shape

A real, currently-published spec (GET /registry/pipelines/flappy-demo, right now):

{
  "id": "flappy-demo",
  "roles": [
    {"service": "TextGeneration", "units": 1, "tag": "physics", "selection_policy": null},
    {"service": "TextGeneration", "units": 1, "tag": "art", "selection_policy": null},
    {"service": "SafetyCheck", "units": 1, "tag": "safety_check", "selection_policy": null}
  ],
  "operator_pubkey_hex": null,
  "selection_policy": "LowestFloor"
}

Publish it

curl -X POST https://bunsenbrenner.org/me/pipelines \
  -H "authorization: Bearer $TOKEN" \
  -H 'content-type: application/json' \
  -d '{"spec":{"id":"docs-example-pipeline","roles":[{"service":"TextGeneration","units":1,"tag":"docs-example-role"}]}}'

200 on success. The owner is whoever’s subject signed the token — not a request field, so nobody can publish on someone else’s behalf. Confirmed by this control plane’s own test suite (re-run hermetically for this page, still passing): publishing under a different subject than the one that already owns an id gets 403, but republishing under the same subject — to update roles, add operator_pubkey_hex, whatever — succeeds and just overwrites the previous spec.

Confirm it’s discoverable

curl -s https://bunsenbrenner.org/registry/pipelines

Public, no auth — lists every published pipeline as [{"id", "owner"}]. Fetch your own spec back in full at GET /registry/pipelines/:id, the same shape shown above. This is the same public registry Workflow pipelines & the auction model and the landing page’s pipeline table both read — nothing extra to wire up once you’ve published.

Found an error, or something that didn't work as documented? Open an issue →