---
title: "Publish Action"
method: POST
path: "/api/workflows/{team_key}/actions/{action_key}/publish"
tags: ["workflows"]
---

# Publish Action

`POST /api/workflows/{team_key}/actions/{action_key}/publish`

## Request

- Base URL: `https://api.superit.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.superit.ai/api/workflows/{team_key}/actions/{action_key}/publish`
- Auth: HTTP bearer

## Path parameters

- `action_key` string, required
- `team_key` string, required

## Request body

- PublishActionBody
  - `managedTeamKeys` string[]

## Response `200`

Successful Response

- PublishActionResponse
  - `action` ActionDetail, required
    - `key` string, required
    - `name` string, required
    - `description` string, required
    - `status` 'draft' | 'published', required
    - `runtime` 'powershell' | 'python' | 'playwright', required
    - `draft` string, required
    - `published` string, nullable, required
    - `authorisation` AuthorizationMatrix, required: Ordered list of rules, evaluated top-down, first match wins.
      - `rules` AuthorizationRule[], required
        - `requester` union, required
          - GroupTagMatcher: Match users by membership in one or more superit tags.
            - `tag` 'group', required
            - `tags` string[], required
          - SelfTagMatcher: Match the requesting user.
            - `tag` 'self', required
          - NoneTagMatcher: Match unconditionally — no tag required. Evaluated by ``_matches`` (services/authorization.py) as an unconditional ``True``, so it means opposite things depending on which field it's used in: as a requester/target matcher it means "anyone" (no restriction); as an approver it means "no approval needed" (self-service). The UI labels it accordingly per field (``TagMatcherEditor.tsx``'s ``REQUESTER_MODES`` vs ``APPROVER_MODES``) rather than showing one generic label.
            - `tag` 'none', required
        - `approver` union, required
          - GroupTagMatcher: Match users by membership in one or more superit tags.
            - `tag` 'group', required
            - `tags` string[], required
          - SelfTagMatcher: Match the requesting user.
            - `tag` 'self', required
          - NoneTagMatcher: Match unconditionally — no tag required. Evaluated by ``_matches`` (services/authorization.py) as an unconditional ``True``, so it means opposite things depending on which field it's used in: as a requester/target matcher it means "anyone" (no restriction); as an approver it means "no approval needed" (self-service). The UI labels it accordingly per field (``TagMatcherEditor.tsx``'s ``REQUESTER_MODES`` vs ``APPROVER_MODES``) rather than showing one generic label.
            - `tag` 'none', required
        - `target` union
          - GroupTagMatcher: Match users by membership in one or more superit tags.
            - `tag` 'group', required
            - `tags` string[], required
          - SelfTagMatcher: Match the requesting user.
            - `tag` 'self', required
          - NoneTagMatcher: Match unconditionally — no tag required. Evaluated by ``_matches`` (services/authorization.py) as an unconditional ``True``, so it means opposite things depending on which field it's used in: as a requester/target matcher it means "anyone" (no restriction); as an approver it means "no approval needed" (self-service). The UI labels it accordingly per field (``TagMatcherEditor.tsx``'s ``REQUESTER_MODES`` vs ``APPROVER_MODES``) rather than showing one generic label.
            - `tag` 'none', required
      - `target_input` string, nullable
    - `authorisationPolicyKey` string, nullable
    - `authorisationPolicyName` string, nullable
    - `publishedByKey` string, nullable, required
    - `publishedAt` string, date-time, nullable, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `credentials` CredentialListItem[]
      - `key` string, required
      - `name` string, required
      - `credentialType` 'oauth_app' | 'api_key', required
      - `hasToken` boolean
      - `isConfigured` boolean, nullable
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
      - `envVars` string[]
    - `inputsSchema` InputField[], nullable, required
      - `name` string, required
      - `type` 'string' | 'email' | 'boolean' | 'date' | 'enum' | 'string[]' | 'textarea', required
      - `label` string, required
      - `required` boolean
      - `choices` string[], nullable
      - `default` string, nullable
    - `approvalSchema` InputField[], nullable, required
      - `name` string, required
      - `type` 'string' | 'email' | 'boolean' | 'date' | 'enum' | 'string[]' | 'textarea', required
      - `label` string, required
      - `required` boolean
      - `choices` string[], nullable
      - `default` string, nullable
    - `allowedHosts` string[], nullable, required
    - `executionTarget` string
    - `meshDeviceSelector` string, nullable
    - `pollTimeoutSeconds` integer, nullable
    - `pollIntervalSeconds` integer
    - `scriptTimeoutSeconds` integer, nullable
    - `autoRun` boolean
    - `workflowSummary` WorkflowSummaryStep[], nullable
      - `name` string, required
      - `description` string, required
    - `workflowSummaryStatus` 'idle' | 'regenerating' | 'failed'
    - `originActionKey` string, nullable
    - `originTeamKey` string, nullable
    - `publishedTeamCount` integer
  - `teams` PublishTeamResult[]
    - `teamKey` string, required
    - `status` 'published' | 'failed' | 'retracted', required
    - `reason` string, nullable

## Other responses

- `400`: Invalid input
- `401`: Not authenticated
- `403`: Forbidden
- `404`: Not found
- `405`: Method not allowed
- `409`: Conflict
- `422`: Validation Error

---

[API](https://skmtc.dev/superit/apis/super-it-api.md) - [All operations](https://skmtc.dev/superit/apis/super-it-api/llms.txt) - [OpenAPI document](https://skmtc.dev/superit/apis/super-it-api/revisions/4944d556c2bb?raw)
