Reserve dedicated worker capacity for specific projects
By default every worker serves every project from one shared queue. When one busy project floods it, everyone else waits.Worker groups fix that. A group is a named pool of workers with its own dedicated queue. Assign a project to a group and its runs get reserved workers no other project can take.
A worker joins a group by setting its group ID at startup. AP_WORKER_GROUP_SCOPE selects the group’s scope:
Project group — AP_WORKER_GROUP_SCOPE=project (the default). Assign individual projects to it from Platform Admin → Operations → Workers → Worker groups.
Flow group — AP_WORKER_GROUP_SCOPE=flow. Pins individual flows to it, regardless of which group (if any) their project is in. See Assigning flows to a group.
Platform group — AP_WORKER_GROUP_SCOPE=platform (or the legacy AP_PROJECT_WORKER=false). Serves the whole platform’s runs; used for dedicated/canary fleets.
A group’s scope is fixed by whichever scope its workers connect with — a label can’t take both project and flow assignments at once, so give project and flow pools distinct AP_WORKER_GROUP_ID values.
# Project group, e.g. 1cpu_machine (AP_WORKER_GROUP_SCOPE defaults to project)AP_WORKER_GROUP_ID=1cpu_machine# Flow group, e.g. gpu_flowsAP_WORKER_GROUP_ID=gpu_flowsAP_WORKER_GROUP_SCOPE=flow# Platform groupAP_WORKER_GROUP_ID=canaryAP_WORKER_GROUP_SCOPE=platform
AP_PROJECT_WORKER (true/false) still works as the legacy project-vs-platform toggle, but AP_WORKER_GROUP_SCOPE is the current setting and the only way to request the flow scope.
Grouped workers must set:
AP_REUSE_SANDBOX=true # or false, must be set explicitly
Routing runs to worker group queues is done by the project rate limiter, so the app server must run with AP_PROJECT_RATE_LIMITER_ENABLED=true. Without it, assigned projects keep using the shared queue and grouped workers stay idle.
Once a project is assigned to a group, its flow and webhook runs are routed to that group’s dedicated queue (project-<group-name>-jobs) and picked up only by workers carrying the matching AP_WORKER_GROUP_ID with scope project. If no worker in the group is online, runs wait in the group queue until one connects — they are never executed by shared workers. Changing a project’s assignment — to a group, between groups, or back to shared — also moves its waiting runs to the new queue. Projects without a group keep drawing from the shared queue.A flow pinned to a group works the same way, but on its own queue (flow-<group-name>-jobs), picked up only by workers with scope flow. A flow’s own pin always wins over its project’s group — pin a flow to send just that flow’s runs elsewhere without moving the rest of the project.
You can assign a project to a project group in two ways:
UI — go to Platform admin → Operations → Workers → Worker groups (/platform/workers/groups) and pick the group for each project.
API — set workerGroupId on the project via the projects API. Use the bare group name (the same value as the group’s AP_WORKER_GROUP_ID); pass null to unassign and return the project to the shared queue.
The same request also sets maxConcurrentJobs — the project’s concurrency limit (the soft-cap ceiling). It’s the maximum number of flow runs the project executes at once:
Omit it (or send null) and the project uses the default: min(plan limit, group slots) — i.e. it can use the group’s full reserved capacity, up to the plan’s limit.
Set a number to cap the project below that. The value is clamped to the group’s slot count (a project can’t run more concurrently than its pool can serve).
Pin individual flows to a flow group when only a few flows — not their whole project — need dedicated capacity (more memory, a GPU, a specific region). A pinned flow’s runs route to that group even if its project is on the shared queue or assigned elsewhere; unpin it and the flow falls back to its project’s group, or the shared queue.
UI — go to Platform admin → Operations → Workers → Worker groups (/platform/workers/groups), open a flow group, and add flows to it by searching across projects.
API — POST /v1/worker-groups/assignments/flows with a platform API key:
Pass workerGroupId: null to unpin flows and return them to their project’s group. If workers are currently online under that group label with the project scope, assigning a flow to it is rejected — a label serves one scope at a time.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Activepieces","colors":{"primary":"#9675FF","light":"#9675FF","dark":"#9675FF"},"logo":{"light":"https://mintcdn.com/activepieces/fJ5Tlm8YTN5F2Mlz/resources/logo/light.svg?fit=max\u0026auto=format\u0026n=fJ5Tlm8YTN5F2Mlz\u0026q=85\u0026s=45ca3c4c50e981e74952921edc9a9fa2","dark":"https://mintcdn.com/activepieces/fJ5Tlm8YTN5F2Mlz/resources/logo/dark.svg?fit=max\u0026auto=format\u0026n=fJ5Tlm8YTN5F2Mlz\u0026q=85\u0026s=19d53837418091737fc386a2863fe6b0","href":"https://www.activepieces.com"},"favicon":"https://mintcdn.com/activepieces/fJ5Tlm8YTN5F2Mlz/favicon.svg?fit=max\u0026auto=format\u0026n=fJ5Tlm8YTN5F2Mlz\u0026q=85\u0026s=3974767b9f13bd8747287d75de7a1204","api":{"openapi":["openapi.json"]},"background":{"color":{"light":"#ffffff","dark":"#090d0d"}},"navbar":{"links":[{"href":"https://github.com/activepieces/activepieces","label":"GitHub"},{"href":"https://www.activepieces.com/pieces","label":"Pieces"}],"primary":{"type":"button","label":"Sign Up","href":"https://cloud.activepieces.com/sign-up"}},"footer":{"socials":{"x":"https://x.com/activepieces","github":"https://github.com/activepieces/activepieces","linkedin":"https://linkedin.com/company/activepieces"}},"styling":{"latex":false},"navigation":{"global":{},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"activepieces","hasAudioNarration":false,"actualSubdomain":"activepieces","customDomains":["www.activepieces.com"],"gitSource":{"type":"github","owner":"activepieces","repo":"activepieces","deployBranch":"main","contentDirectory":"docs","mountPath":"","label":""},"feedback":{"edits":true,"issues":true,"agentFeedback":true,"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af2ee4b1661757f0de1edf7","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"API Reference","count":81},{"language":"default","tag":"Endpoints","count":78},{"language":"default","tag":"Enterprise Control","count":75},{"language":"default","tag":"Guides","count":74},{"language":"default","tag":"Get Started","count":69},{"language":"default","tag":"Install Activepieces","count":51},{"language":"default","tag":"Audit Logs","count":44},{"language":"default","tag":"About","count":42},{"language":"default","tag":"Observability","count":41},{"language":"default","tag":"Build Pieces","count":40}]},"assistantConfig":{"enableStarterQuestions":true,"deflection":{"enabled":true,"email":"[email protected]","showHelpButton":true}},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"starterQuestions":[{"_id":"69df3ea534438eefba3c55ed","deploymentId":"636f0b1d59792292a7e133be","questionText":"what is Activepieces's hiring process ?","status":"active","generatedBy":"manual","createdAt":"2026-04-15T07:30:45.300Z","updatedAt":"2026-04-15T07:30:45.300Z","__v":0},{"_id":"69df3e4d34438eefba3c51ae","deploymentId":"636f0b1d59792292a7e133be","questionText":"How to self-host Activepieces ?","status":"active","generatedBy":"manual","createdAt":"2026-04-15T07:29:17.523Z","updatedAt":"2026-04-15T07:30:56.547Z","__v":0},{"_id":"69df3e2d34438eefba3c4f73","deploymentId":"636f0b1d59792292a7e133be","questionText":"How do I create a new piece ?","status":"active","generatedBy":"manual","createdAt":"2026-04-15T07:28:45.786Z","updatedAt":"2026-04-15T07:30:50.754Z","__v":0}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":".pp{--pp-primary: hsl(257 74% 57%);--pp-primary-wash: hsl(257 74% 57% / 0.10);--pp-fg: #171717;--pp-muted: #737373;--pp-faint: #a3a3a3;--pp-border: #e5e5e5;--pp-soft: #f5f5f5;--pp-bg: #ffffff;--pp-switch-off: #d4d4d4;box-sizing:border-box;border:1px solid var(--pp-border);border-radius:12px;background:var(--pp-bg);padding:18px 16px;margin:12px 0 20px;font-family:\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;font-size:14px;line-height:1.5;color:var(--pp-fg);max-width:560px}.pp *,.pp *::before,.pp *::after{box-sizing:border-box}.pp-field{display:flex;flex-direction:column;gap:6px}.pp-label{display:flex;align-items:center;gap:4px;font-size:14px;font-weight:500;color:var(--pp-fg);margin:0}.pp-req{color:hsl(350 89% 60%)}.pp-desc{font-size:12px;color:var(--pp-muted)}.pp-input{display:flex;align-items:center;height:36px;border:1px solid var(--pp-border);border-radius:6px;padding:0 10px;font-size:14px;color:var(--pp-fg);background:var(--pp-bg)}.pp-input.pp-ph{color:var(--pp-faint)}.pp-textarea{min-height:76px;align-items:flex-start;padding:8px 10px}.pp-select{justify-content:space-between}.pp-caret{width:8px;height:8px;border-right:1.5px solid var(--pp-faint);border-bottom:1.5px solid var(--pp-faint);transform:rotate(45deg);margin-top:-3px;flex:none}.pp-switch{width:34px;height:20px;border-radius:999px;background:var(--pp-primary);position:relative;flex:none}.pp-switch::after{content:\"\";position:absolute;top:2px;left:16px;width:16px;height:16px;border-radius:50%;background:#fff;transition:left .15s ease}.pp-switch.pp-off{background:var(--pp-switch-off)}.pp-switch.pp-off::after{left:2px}.pp-switch-row{display:flex;align-items:center;gap:10px}.pp-switch-row .pp-t{font-size:14px;font-weight:500}.pp-switch-row .pp-d{font-size:12px;color:var(--pp-muted)}.pp-chip{display:inline-flex;align-items:center;gap:5px;background:var(--pp-primary-wash);color:var(--pp-primary);font-size:12.5px;font-weight:500;border-radius:999px;padding:2px 6px 2px 9px}.pp-chip .pp-x{color:var(--pp-primary);opacity:.7;font-size:13px}.pp-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:40px;border:1px solid var(--pp-border);border-radius:6px;padding:6px 8px}.pp-chips .pp-ph{color:var(--pp-faint);font-size:14px}.pp-code{font-family:ui-monospace, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;font-size:12.5px;line-height:1.6;background:var(--pp-soft);border:1px solid var(--pp-border);border-radius:6px;padding:10px 12px;color:#3f3f46;white-space:pre;overflow-x:auto}.pp-key{color:hsl(257 74% 45%)}.pp-str{color:hsl(160 84% 30%)}.pp-kv{display:grid;grid-template-columns:1fr 1fr 24px;gap:6px;align-items:center}.pp-kv.pp-one{grid-template-columns:1fr 24px}.pp-iconbtn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:var(--pp-faint)}.pp-add{color:var(--pp-primary);font-size:13px;font-weight:600;display:inline-flex;align-items:center;gap:5px;margin-top:8px}.pp-list{display:flex;flex-direction:column;gap:6px}.pp-swatch{width:28px;height:28px;border-radius:6px;border:1px solid var(--pp-border);flex:none;background:hsl(257 74% 57%)}.pp-row{display:flex;align-items:center;gap:8px}.pp-item{border:1px solid var(--pp-border);border-radius:8px;padding:12px;display:flex;flex-direction:column;gap:10px;position:relative}.pp-item .pp-rm{position:absolute;top:8px;right:8px;color:var(--pp-faint)}.pp-note{border:1px solid hsl(257 74% 57% / 0.18);background:var(--pp-primary-wash);border-radius:8px;padding:12px 14px;font-size:13.5px;line-height:1.5;color:#3f3f46}.pp-note strong{display:block;margin-bottom:2px;color:var(--pp-fg)}.pp-rt{border:1px solid var(--pp-border);border-radius:6px;overflow:hidden}.pp-rt-toolbar{display:flex;align-items:center;gap:2px;padding:5px 6px;border-bottom:1px solid var(--pp-border);background:#fcfcfd}.pp-rt-btn{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:5px;font-size:13px;color:#52525b}.pp-rt-btn.pp-b{font-weight:800}.pp-rt-btn.pp-i{font-style:italic;font-family:Georgia, serif}.pp-rt-btn.pp-u{text-decoration:underline}.pp-rt-sep{width:1px;height:16px;background:var(--pp-border);margin:0 3px}.pp-rt-body{padding:10px 12px;font-size:14px;line-height:1.6;min-height:60px}.pp-mention{background:var(--pp-primary-wash);color:var(--pp-primary);border-radius:5px;padding:1px 5px;font-size:13px;font-weight:500}.pp-cards{display:flex;gap:8px;flex-wrap:wrap}.pp-rcard{flex:1 1 0;min-width:120px;display:flex;align-items:center;gap:10px;border:1px solid var(--pp-border);border-radius:8px;padding:11px 12px}.pp-rcard.pp-sel{border-color:var(--pp-primary);background:hsl(257 74% 57% / 0.05)}.pp-rcard .pp-ic{width:28px;height:28px;border-radius:6px;background:var(--pp-soft);display:flex;align-items:center;justify-content:center;color:#52525b;flex:none;font-family:ui-monospace, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;font-size:12px}.pp-rcard.pp-sel .pp-ic{background:var(--pp-primary-wash);color:var(--pp-primary)}.pp-rcard .pp-t{font-size:13.5px;font-weight:600}.pp-rcard .pp-d{font-size:11.5px;color:var(--pp-muted)}.pp-stepper{display:inline-flex;align-items:center;border:1px solid var(--pp-border);border-radius:6px;overflow:hidden;height:36px}.pp-stepper button{width:34px;height:100%;border:none;background:var(--pp-bg);color:var(--pp-fg);font-size:16px;border-right:1px solid var(--pp-border);cursor:pointer}.pp-stepper button:last-child{border-right:none;border-left:1px solid var(--pp-border)}.pp-stepper .pp-val{width:46px;text-align:center;font-size:14px;font-variant-numeric:tabular-nums}.pp-stepper-row{display:flex;align-items:center;justify-content:space-between}.pp-reveal{border:1px solid var(--pp-border);background:#fafafa;border-radius:8px;padding:12px 13px}.pp-reveal .pp-divider{margin-top:12px;padding-top:12px;border-top:1px dashed var(--pp-border)}.pp-presets{display:flex;gap:6px;flex-wrap:wrap}.pp-pill{border:1px solid var(--pp-border);border-radius:999px;padding:4px 12px;font-size:13px;color:var(--pp-muted)}.pp-pill.pp-sel{border-color:var(--pp-primary);background:hsl(257 74% 57% / 0.05);color:var(--pp-primary);font-weight:600}.pp-daterow{display:flex;align-items:flex-end;gap:8px;margin-top:10px}.pp-daterow .pp-col{flex:1}.pp-daterow .pp-cl{font-size:11px;color:var(--pp-muted);margin-bottom:3px}.pp-tabs{display:flex;background:var(--pp-soft);border-radius:8px;padding:3px;gap:2px}.pp-tab{flex:1;text-align:center;font-size:13px;font-weight:500;padding:6px 0;border-radius:6px;color:var(--pp-muted)}.pp-tab.pp-sel{background:var(--pp-bg);color:var(--pp-fg);font-weight:600;box-shadow:0 1px 2px rgba(0,0,0,.06)}.pp-twoup{display:grid;grid-template-columns:1fr 1fr;gap:10px}.pp-fb{border:1px solid var(--pp-border);border-radius:14px;overflow:hidden}.pp-fb-row{display:flex;align-items:center;gap:10px;padding:11px 12px;border-bottom:1px solid #f0f0f0}.pp-fb-badge{width:28px;height:28px;border-radius:8px;background:var(--pp-primary-wash);color:var(--pp-primary);display:flex;align-items:center;justify-content:center;flex:none}.pp-fb-lbl{width:72px;flex:none;font-size:13.5px;font-weight:600}.pp-fb-ctrl{flex:1;min-width:0}.pp-fb-x{color:var(--pp-faint);flex:none}.pp-fb-add{display:flex;align-items:center;gap:6px;margin:10px 12px;border:1px solid var(--pp-border);border-radius:9px;padding:8px 12px;width:fit-content;color:var(--pp-primary);font-size:13px;font-weight:600}.pp-fb-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;border:1px solid var(--pp-border);border-radius:14px;padding:11px 14px;margin-top:10px}.pp-fb-foot .pp-ic{width:28px;height:28px;border-radius:8px;background:var(--pp-primary-wash);color:var(--pp-primary);display:flex;align-items:center;justify-content:center;flex:none}.pp-fb-foot .pp-t{font-size:13.5px;font-weight:600}.pp-fb-foot .pp-s{font-size:11.5px;color:var(--pp-muted)}.pp .pp-i{display:inline-block;width:15px;height:15px;flex:none;background-color:currentColor;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.pp .pp-i-cal{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Crect x='3' y='4' width='18' height='18' rx='2'/%3E%3Cpath d='M16 2v4M8 2v4M3 10h18'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Crect x='3' y='4' width='18' height='18' rx='2'/%3E%3Cpath d='M16 2v4M8 2v4M3 10h18'/%3E%3C/svg%3E\")}.pp .pp-i-clip{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M21.44 11.05l-9.19 9.19a5 5 0 0 1-7.07-7.07l9.19-9.19a3 3 0 0 1 4.24 4.24l-9.2 9.19a1 1 0 0 1-1.41-1.41l8.48-8.49'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M21.44 11.05l-9.19 9.19a5 5 0 0 1-7.07-7.07l9.19-9.19a3 3 0 0 1 4.24 4.24l-9.2 9.19a1 1 0 0 1-1.41-1.41l8.48-8.49'/%3E%3C/svg%3E\")}.pp .pp-i-search{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E\")}.pp .pp-i-link{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-1 1'/%3E%3Cpath d='M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l1-1'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-1 1'/%3E%3Cpath d='M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l1-1'/%3E%3C/svg%3E\")}.pp .pp-i-user{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2'/%3E%3Ccircle cx='12' cy='7' r='4'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2'/%3E%3Ccircle cx='12' cy='7' r='4'/%3E%3C/svg%3E\")}.pp .pp-i-sliders{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cline x1='4' y1='6' x2='20' y2='6'/%3E%3Cline x1='7' y1='12' x2='17' y2='12'/%3E%3Cline x1='10' y1='18' x2='14' y2='18'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cline x1='4' y1='6' x2='20' y2='6'/%3E%3Cline x1='7' y1='12' x2='17' y2='12'/%3E%3Cline x1='10' y1='18' x2='14' y2='18'/%3E%3C/svg%3E\")}.dark .pp{--pp-fg: #e8e8ea;--pp-muted: #9a9aa5;--pp-faint: #6b6b74;--pp-border: #2d2d34;--pp-soft: #26262c;--pp-bg: #1b1b20;--pp-switch-off: #3f3f46;--pp-primary: hsl(257 82% 72%);--pp-primary-wash: hsl(257 74% 62% / 0.22)}.dark .pp .pp-code,.dark .pp .pp-note{color:#c9c8d2}.dark .pp .pp-key{color:hsl(257 82% 76%)}.dark .pp .pp-str{color:hsl(160 60% 62%)}.dark .pp .pp-rt-btn{color:#a1a1aa}.dark .pp .pp-rt-toolbar{background:#232329}.dark .pp .pp-rcard .pp-ic{color:#c9c8d2}.dark .pp .pp-reveal{background:#202026}.dark .pp .pp-fb-row{border-bottom-color:#2d2d34}.vr{--vr-accent: #9675FF;--vr-accent-fg: #ffffff;--vr-marker: #171717;--vr-fg: #171717;--vr-muted: #737373;--vr-border: #e5e5e5;--vr-bg: #ffffff;box-sizing:border-box;border:1px solid var(--vr-border);border-radius:12px;background:var(--vr-bg);padding:20px 16px 16px;margin:16px 0 24px;font-family:\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;font-size:14px;line-height:1.5;color:var(--vr-fg)}.vr *,.vr *::before,.vr *::after{box-sizing:border-box}.vr-intro{margin-bottom:20px;font-size:13px;color:var(--vr-muted)}.vr-row{display:grid;grid-template-columns:200px 1fr;gap:12px}.vr-lane{position:relative;margin:0 24px 0 0}.vr-head{font-size:13px;font-weight:600;margin-bottom:12px}.vr-marker-label{position:absolute;top:0;transform:translateX(-50%);font-size:13px;font-weight:600;white-space:nowrap;transition:left 120ms ease}.vr-labels,.vr-bars{display:flex;flex-direction:column;gap:10px;padding:8px 0 16px}.vr-label{display:flex;align-items:center;justify-content:space-between;gap:12px;height:30px}.vr-name{font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}.vr-status{font-size:12px;font-weight:600}.vr-status-on{color:var(--vr-accent)}.vr-status-off{color:var(--vr-muted)}.vr-track{position:relative;height:30px}.vr-bar{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding:0 10px;border-radius:6px;font-size:13px;white-space:nowrap;font-variant-numeric:tabular-nums;transition:background-color 150ms ease, color 150ms ease, border-color 150ms ease}.vr-bar-on{background:var(--vr-accent);color:var(--vr-accent-fg);border:1px solid var(--vr-accent)}.vr-bar-off{background:transparent;color:var(--vr-fg);border:1.5px dashed var(--vr-muted)}.vr-bar-short .vr-bar-text{position:absolute;right:calc(100% + 8px);color:var(--vr-fg)}.vr-marker{position:absolute;top:0;bottom:0;width:2px;margin-left:-1px;z-index:1;background:var(--vr-marker);pointer-events:none;transition:left 120ms ease}.vr-axis{position:relative;height:28px;border-top:1px solid var(--vr-muted)}.vr-tick{position:absolute;top:0;padding-top:12px;transform:translateX(-50%);font-size:12px;color:var(--vr-muted);white-space:nowrap}.vr-tick::before{content:\"\";position:absolute;top:0;left:50%;width:1px;height:6px;background:var(--vr-muted)}.vr-axis-caption{margin-top:4px;text-align:right;font-size:12px;color:var(--vr-muted)}.vr-control{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:16px;margin-top:16px;cursor:pointer}.vr-control-label{font-weight:600}.vr-control-value{font-weight:600;min-width:56px;text-align:right}.vr-slider{width:100%;margin:0;accent-color:var(--vr-accent);cursor:pointer}@media (max-width: 520px){.vr-row{grid-template-columns:112px 1fr;gap:8px}.vr-label{flex-direction:column;align-items:flex-start;justify-content:center;gap:0;height:36px;line-height:1.2}.vr-name{font-size:12px}.vr-track{height:36px}.vr-lane{margin-right:16px}.vr-bar{font-size:0;padding:0}.vr-tick:nth-child(even){display:none}.vr-control{grid-template-columns:1fr auto}.vr-control-label{grid-column:1 / -1}}.dark .vr{--vr-accent: #9675FF;--vr-accent-fg: #ffffff;--vr-marker: #e8e8ea;--vr-fg: #e8e8ea;--vr-muted: #9a9aa5;--vr-border: #2d2d34;--vr-bg: #1b1b20}"}],"page":{"pagePath":"install/configure-operate/worker-groups","slug":"/install/configure-operate/worker-groups","pageMetadata":{"title":"Worker Groups","description":"Reserve dedicated worker capacity for specific projects","icon":"users-gear","href":"/install/configure-operate/worker-groups"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Reserve dedicated worker capacity for specific projects\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,OptimizedImage,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`By default every worker serves every project from one shared queue. When one busy project floods it, everyone else waits.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Worker groups`}),` fix that. A group is a named pool of workers with its own dedicated queue. Assign a project to a group and its runs get reserved workers no other project can take.`]}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/activepieces/HPdB7kMdQC2Eh_kp/resources/diagrams/worker-groups.png?fit=max\u0026auto=format\u0026n=HPdB7kMdQC2Eh_kp\u0026q=85\u0026s=d55034f69fd423265319a2dabd339aef`,alt:`Worker groups: projects map to dedicated queues, each backed by its own reserved worker pool, while ungrouped projects share a best-effort queue`,\"data-og-width\":`2360`,width:`2360`,\"data-og-height\":`1280`,height:`1280`,\"data-path\":`resources/diagrams/worker-groups.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/activepieces/HPdB7kMdQC2Eh_kp/resources/diagrams/worker-groups.png?w=280\u0026fit=max\u0026auto=format\u0026n=HPdB7kMdQC2Eh_kp\u0026q=85\u0026s=93fa23daae0ccb3a2babdf4fae1b34d5 280w, https://mintcdn.com/activepieces/HPdB7kMdQC2Eh_kp/resources/diagrams/worker-groups.png?w=560\u0026fit=max\u0026auto=format\u0026n=HPdB7kMdQC2Eh_kp\u0026q=85\u0026s=ab5cdfb2977acfdc40a4b676a9b45b3c 560w, https://mintcdn.com/activepieces/HPdB7kMdQC2Eh_kp/resources/diagrams/worker-groups.png?w=840\u0026fit=max\u0026auto=format\u0026n=HPdB7kMdQC2Eh_kp\u0026q=85\u0026s=0cc548609130c79b703deb79c63dab03 840w, https://mintcdn.com/activepieces/HPdB7kMdQC2Eh_kp/resources/diagrams/worker-groups.png?w=1100\u0026fit=max\u0026auto=format\u0026n=HPdB7kMdQC2Eh_kp\u0026q=85\u0026s=041e1e37162752d5bc6b166b639e17d7 1100w, https://mintcdn.com/activepieces/HPdB7kMdQC2Eh_kp/resources/diagrams/worker-groups.png?w=1650\u0026fit=max\u0026auto=format\u0026n=HPdB7kMdQC2Eh_kp\u0026q=85\u0026s=658393937532af19619e0c5e2b18963b 1650w, https://mintcdn.com/activepieces/HPdB7kMdQC2Eh_kp/resources/diagrams/worker-groups.png?w=2500\u0026fit=max\u0026auto=format\u0026n=HPdB7kMdQC2Eh_kp\u0026q=85\u0026s=76bce75d2a2be111342042c7894df614 2500w`}),`\n`,_jsx(Heading,{level:`2`,id:`floor-vs-ceiling`,children:`Floor vs. ceiling`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.strong,{children:`worker group`}),` is a `,_jsx(_components.strong,{children:`floor`}),`: capacity reserved for a project that nobody else can use.`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.strong,{children:`soft cap`}),` is a `,_jsx(_components.strong,{children:`ceiling`}),`: an optional per-project limit on how much a project can use. See `,_jsx(_components.a,{href:`/admin-guide/guides/manage-concurrency`,children:`Manage Concurrency`}),` for details.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Use both together to guarantee capacity for busy projects and cap the rest.`}),`\n`,_jsx(Heading,{level:`2`,id:`how-it-works`,children:`How it works`}),`\n`,_jsxs(_components.p,{children:[`A worker joins a group by setting its group ID at startup. `,_jsx(_components.code,{children:`AP_WORKER_GROUP_SCOPE`}),` selects the group’s scope:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Project`}),` group — `,_jsx(_components.code,{children:`AP_WORKER_GROUP_SCOPE=project`}),` (the default). Assign individual projects to it from `,_jsx(_components.strong,{children:`Platform Admin → Operations → Workers → Worker groups`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Flow`}),` group — `,_jsx(_components.code,{children:`AP_WORKER_GROUP_SCOPE=flow`}),`. Pins individual flows to it, regardless of which group (if any) their project is in. See `,_jsx(_components.a,{href:`#assigning-flows-to-a-group`,children:`Assigning flows to a group`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Platform`}),` group — `,_jsx(_components.code,{children:`AP_WORKER_GROUP_SCOPE=platform`}),` (or the legacy `,_jsx(_components.code,{children:`AP_PROJECT_WORKER=false`}),`). Serves the whole platform’s runs; used for dedicated/canary fleets.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`A group’s scope is fixed by whichever scope its workers connect with — a label can’t take both project and flow assignments at once, so give project and flow pools distinct `,_jsx(_components.code,{children:`AP_WORKER_GROUP_ID`}),` values.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Project group, e.g. 1cpu_machine (AP_WORKER_GROUP_SCOPE defaults to project)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`AP_WORKER_GROUP_ID`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`1cpu_machine`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Flow group, e.g. gpu_flows`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`AP_WORKER_GROUP_ID`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`gpu_flows`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`AP_WORKER_GROUP_SCOPE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`flow`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Platform group`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`AP_WORKER_GROUP_ID`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`canary`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`AP_WORKER_GROUP_SCOPE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`platform`})]}),`\n`]})})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`AP_PROJECT_WORKER`}),` (`,_jsx(_components.code,{children:`true`}),`/`,_jsx(_components.code,{children:`false`}),`) still works as the legacy project-vs-platform toggle, but `,_jsx(_components.code,{children:`AP_WORKER_GROUP_SCOPE`}),` is the current setting and the only way to request the flow scope.`]})}),`\n`,_jsx(_components.p,{children:`Grouped workers must set:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`AP_REUSE_SANDBOX`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`true`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # or false, must be set explicitly`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Routing runs to worker group queues is done by the project rate limiter, so the app server must run with `,_jsx(_components.code,{children:`AP_PROJECT_RATE_LIMITER_ENABLED=true`}),`. Without it, assigned projects keep using the shared queue and grouped workers stay idle.`]})}),`\n`,_jsxs(_components.p,{children:[`Once a project is assigned to a group, its flow and webhook runs are routed to that group’s dedicated queue (`,_jsx(_components.code,{children:`project-\u003cgroup-name>-jobs`}),`) and picked up only by workers carrying the matching `,_jsx(_components.code,{children:`AP_WORKER_GROUP_ID`}),` with scope `,_jsx(_components.code,{children:`project`}),`. If no worker in the group is online, runs wait in the group queue until one connects — they are never executed by shared workers. Changing a project’s assignment — to a group, between groups, or back to shared — also moves its waiting runs to the new queue. Projects without a group keep drawing from the shared queue.`]}),`\n`,_jsxs(_components.p,{children:[`A flow pinned to a group works the same way, but on its own queue (`,_jsx(_components.code,{children:`flow-\u003cgroup-name>-jobs`}),`), picked up only by workers with scope `,_jsx(_components.code,{children:`flow`}),`. `,_jsx(_components.strong,{children:`A flow’s own pin always wins over its project’s group`}),` — pin a flow to send just that flow’s runs elsewhere without moving the rest of the project.`]}),`\n`,_jsx(Heading,{level:`2`,id:`assigning-projects-to-a-group`,children:`Assigning projects to a group`}),`\n`,_jsx(_components.p,{children:`You can assign a project to a project group in two ways:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`UI`}),` — go to `,_jsx(_components.strong,{children:`Platform admin → Operations → Workers → Worker groups`}),` (`,_jsx(_components.code,{children:`/platform/workers/groups`}),`) and pick the group for each project.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`API`}),` — set `,_jsx(_components.code,{children:`workerGroupId`}),` on the project via the projects API. Use the bare group name (the same value as the group’s `,_jsx(_components.code,{children:`AP_WORKER_GROUP_ID`}),`); pass `,_jsx(_components.code,{children:`null`}),` to unassign and return the project to the shared queue.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The same request also sets `,_jsx(_components.code,{children:`maxConcurrentJobs`}),` — the project’s `,_jsx(_components.strong,{children:`concurrency limit`}),` (the soft-cap ceiling). It’s the maximum number of flow runs the project executes at once:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Omit it`}),` (or send `,_jsx(_components.code,{children:`null`}),`) and the project uses the default: `,_jsx(_components.code,{children:`min(plan limit, group slots)`}),` — i.e. it can use the group’s full reserved capacity, up to the plan’s limit.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Set a number`}),` to cap the project below that. The value is clamped to the group’s slot count (a project can’t run more concurrently than its pool can serve).`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'https://your-instance.com/api/v1/projects/\u003cPROJECT_ID>'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Authorization: Bearer \u003cPLATFORM_API_KEY>'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Content-Type: application/json'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{ \"workerGroupId\": \"1cpu_machine\", \"maxConcurrentJobs\": 2 }'`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`assigning-flows-to-a-group`,children:`Assigning flows to a group`}),`\n`,_jsxs(_components.p,{children:[`Pin individual flows to a `,_jsx(_components.strong,{children:`flow`}),` group when only a few flows — not their whole project — need dedicated capacity (more memory, a GPU, a specific region). A pinned flow’s runs route to that group even if its project is on the shared queue or assigned elsewhere; unpin it and the flow falls back to its project’s group, or the shared queue.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`UI`}),` — go to `,_jsx(_components.strong,{children:`Platform admin → Operations → Workers → Worker groups`}),` (`,_jsx(_components.code,{children:`/platform/workers/groups`}),`), open a flow group, and add flows to it by searching across projects.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`API`}),` — `,_jsx(_components.code,{children:`POST /v1/worker-groups/assignments/flows`}),` with a platform API key:`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'https://your-instance.com/api/v1/worker-groups/assignments/flows'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Authorization: Bearer \u003cPLATFORM_API_KEY>'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Content-Type: application/json'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{ \"flows\": [\"\u003cFLOW_ID>\"], \"workerGroupId\": \"gpu_flows\" }'`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Pass `,_jsx(_components.code,{children:`workerGroupId: null`}),` to unpin flows and return them to their project’s group. If workers are currently online under that group label with the `,_jsx(_components.code,{children:`project`}),` scope, assigning a flow to it is rejected — a label serves one scope at a time.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Worker Groups","description":"Reserve dedicated worker capacity for specific projects","icon":"users-gear","href":"/install/configure-operate/worker-groups"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Floor vs. ceiling","slug":"floor-vs-ceiling","depth":2,"children":[]},{"title":"How it works","slug":"how-it-works","depth":2,"children":[]},{"title":"Assigning projects to a group","slug":"assigning-projects-to-a-group","depth":2,"children":[]},{"title":"Assigning flows to a group","slug":"assigning-flows-to-a-group","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"activepieces","siteName":"Activepieces","title":"Worker Groups - Activepieces","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-03T10:25:02.809Z","originalFileLocation":"install/configure-operate/worker-groups.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Reserve dedicated worker capacity for specific projects\">\u003cmeta data-mint-head name=\"application-name\" content=\"Activepieces\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Worker Groups - Activepieces\">\u003cmeta data-mint-head property=\"og:description\" content=\"Reserve dedicated worker capacity for specific projects\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Activepieces\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://www.activepieces.com/docs/install/configure-operate/worker-groups\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://activepieces.mintlify.site/docs/_mintlify/api/og/v2?division=Operations\u0026amp;title=Worker+Groups\u0026amp;description=Reserve+dedicated+worker+capacity+for+specific+projects\u0026amp;theme=dfb81ba8f2fd7cb079f80ce8\u0026amp;signature=7c2fefc233ffbdd8d4a0d5581ece3e00153e490661bd9592fcf5e65b34f89a1a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Worker Groups - Activepieces\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Reserve dedicated worker capacity for specific projects\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://activepieces.mintlify.site/docs/_mintlify/api/og/v2?division=Operations\u0026amp;title=Worker+Groups\u0026amp;description=Reserve+dedicated+worker+capacity+for+specific+projects\u0026amp;theme=dfb81ba8f2fd7cb079f80ce8\u0026amp;signature=7c2fefc233ffbdd8d4a0d5581ece3e00153e490661bd9592fcf5e65b34f89a1a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/activepieces/p9XH-af1QM0u3PKd/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Activepieces\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#9675FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://www.activepieces.com/docs/install/configure-operate/worker-groups\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/install/configure-operate/worker-groups.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.activepieces.com/#organization\",\"name\":\"Activepieces\",\"url\":\"https://www.activepieces.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/activepieces/fJ5Tlm8YTN5F2Mlz/resources/logo/light.svg?fit=max\u0026auto=format\u0026n=fJ5Tlm8YTN5F2Mlz\u0026q=85\u0026s=45ca3c4c50e981e74952921edc9a9fa2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://www.activepieces.com/docs#website\",\"name\":\"Activepieces\",\"url\":\"https://www.activepieces.com/docs\",\"publisher\":{\"@id\":\"https://www.activepieces.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://www.activepieces.com/docs/install/configure-operate/worker-groups#webpage\",\"url\":\"https://www.activepieces.com/docs/install/configure-operate/worker-groups\",\"name\":\"Worker Groups\",\"description\":\"Reserve dedicated worker capacity for specific projects\",\"dateModified\":\"2026-11-03T10:25:02.809Z\",\"isPartOf\":{\"@id\":\"https://www.activepieces.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://www.activepieces.com/docs/install/configure-operate/worker-groups#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://www.activepieces.com/docs/install/configure-operate/worker-groups#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Self hosting\",\"item\":\"https://www.activepieces.com/docs/install/configure-operate/production-setup\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Worker Groups\",\"item\":\"https://www.activepieces.com/docs/install/configure-operate/worker-groups\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://www.activepieces.com/docs/install/configure-operate/worker-groups#article\",\"headline\":\"Worker Groups\",\"name\":\"Worker Groups\",\"description\":\"Reserve dedicated worker capacity for specific projects\",\"url\":\"https://www.activepieces.com/docs/install/configure-operate/worker-groups\",\"mainEntityOfPage\":{\"@id\":\"https://www.activepieces.com/docs/install/configure-operate/worker-groups#webpage\"},\"dateModified\":\"2026-11-03T10:25:02.809Z\",\"publisher\":{\"@id\":\"https://www.activepieces.com/#organization\"},\"isPartOf\":{\"@id\":\"https://www.activepieces.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Activepieces\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Activepieces\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/docs/install/configure-operate/worker-groups.md","siteName":"Activepieces","nav":{"global":{},"tabs":[{"tab":"Get Started","pages":[{"title":"Get Started","href":"/overview/welcome"}]},{"tab":"Install Activepieces","groups":[{"group":"Install Activepieces","pages":[{"title":"Install Options","sidebarTitle":"Install options","icon":"hand-wave","href":"/install/overview"},{"title":"Self Host Activepieces","sidebarTitle":"Self host (Docker)","icon":"docker","href":"/install/options/docker-compose"},{"title":"Kubernetes Installation","sidebarTitle":"Kubernetes (Helm)","icon":"ship","href":"/install/options/helm"},{"title":"Activate an Enterprise License Key","sidebarTitle":"License key","icon":"key","href":"/install/configure-operate/enterprise-license"},{"group":"Other Options","pages":[{"title":"Hobbyist Installation","sidebarTitle":"Hobby (Docker)","href":"/install/options/docker"},{"title":"Easypanel","href":"/install/options/easypanel"},{"title":"AWS (Pulumi)","href":"/install/options/aws"},{"title":"GCP","href":"/install/options/gcp"},{"title":"Railway","href":"/install/options/railway"},{"title":"Elestio","href":"/install/options/elestio"}]}]},{"group":"Self hosting","pages":[{"title":"Production Setup","icon":"ruler-combined","href":"/install/configure-operate/production-setup"},{"group":"Production Essentials","icon":"rocket","pages":[{"title":"Separate Workers","icon":"robot","href":"/install/configure-operate/separate-workers"},{"title":"Sandboxing Mode","icon":"code","href":"/install/configure-operate/sandboxing"},{"title":"HTTPS","icon":"shield","href":"/install/configure-operate/setup-ssl"},{"title":"S3 Storage","description":"Configure S3-compatible storage for files and run logs","icon":"cloud","href":"/install/configure-operate/setup-s3"}]},{"group":"Operations","icon":"screwdriver-wrench","pages":[{"title":"Worker Groups","icon":"users-gear","href":"/install/configure-operate/worker-groups"},{"title":"App Webhooks","description":null,"icon":"webhook","href":"/install/configure-operate/setup-app-webhooks"},{"title":"Observability","icon":"chart-line","href":"/install/configure-operate/setup-opentelemetry"},{"title":"Telemetry","icon":"calculator","href":"/install/configure-operate/telemetry"},{"title":"Rollback","icon":"rotate-left","href":"/install/configure-operate/rollback"}]}]},{"group":"Troubleshooting","pages":[{"title":"Queues Dashboard","icon":"gauge-high","href":"/install/troubleshooting/bullboard"},{"title":"Reset Password","icon":"key","href":"/install/troubleshooting/reset-password"},{"title":"Truncated Logs","icon":"file-lines","href":"/install/troubleshooting/truncated-logs"},{"title":"Websocket Issues","icon":"plug","href":"/install/troubleshooting/websocket-issues"}]},{"group":"Reference","pages":[{"title":"Environment Variables","icon":"gear","href":"/install/reference/environment-variables"},{"title":"Limits","icon":"ban","href":"/install/reference/limits"},{"title":"Breaking Changes","icon":"hammer","href":"/install/reference/breaking-changes"}]},{"group":"Guarantees","icon":"shield-check","pages":[{"title":"Crash Recovery","icon":"shield-check","href":"/install/guarantees/crash-recovery"},{"title":"Disaster Recovery","icon":"life-ring","href":"/install/guarantees/disaster-recovery"},{"title":"Reserved Resources","icon":"memory","href":"/install/guarantees/reserved-resources"},{"title":"Execution Isolation","icon":"lock","href":"/install/guarantees/execution-isolation"}]},{"group":"Architecture","pages":[{"title":"Overview","icon":"cube","href":"/install/architecture/overview"},{"title":"Workers","icon":"gears","href":"/install/architecture/workers"},{"title":"Sandboxing","icon":"box","href":"/install/architecture/sandboxing"},{"title":"Durable Execution","icon":"shield-check","href":"/install/architecture/durable-execution"},{"title":"Waitpoints","icon":"hourglass-half","href":"/install/architecture/waitpoints"},{"title":"Network Security","icon":"shield-halved","href":"/install/architecture/network-security"},{"title":"Piece syncing \u0026 versioning","icon":"puzzle-piece","href":"/install/architecture/piece-syncing"},{"title":"Benchmark","icon":"gauge-high","href":"/install/architecture/benchmark"},{"title":"Latency","icon":"stopwatch","href":"/install/architecture/latency"},{"title":"Autoscaling","icon":"arrows-up-down","href":"/install/architecture/autoscaling"}]}]},{"tab":"Enterprise Control","icon":"crown","pages":[{"title":"Enterprise Control","href":"/admin-guide/overview"}]},{"tab":"Build Pieces","pages":[{"title":"Build Pieces","href":"/build-pieces/building-pieces/overview"}]},{"tab":"Embed SDK","pages":[{"title":"Embed SDK","href":"/embedding/overview"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/endpoints/overview"}]}]},"basePath":"","title":"Worker Groups - Activepieces","buildId":"dpl_2AK98Hxhwu4fUXpx9atbv41cC328","deploymentId":"dpl_2AK98Hxhwu4fUXpx9atbv41cC328","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-T84NdC3b.js","lightbox-handle-r17bVUz3.js"]}