---
title: "Fire system action by name"
method: PUT
path: "/api/v1/workflow/actions/default/fire/{systemAction}"
tags: ["Workflow"]
---

# Fire system action by name

`PUT /api/v1/workflow/actions/default/fire/{systemAction}`

Fire a [default system action](https://www.dotcms.com/docs/latest/managing-workflows#DefaultActions) by name on a target contentlet.

Returns a map of the resultant contentlet, with an additional `AUTO_ASSIGN_WORKFLOW` property, which can be referenced by delegate services that handle automatically assigning workflow schemes to content with none.

**Request body** — wrap field values in a `contentlet` key:

```json
{
  "contentlet": {
    "contentType": "<variable-or-inode>",
    "title": "My New Item",
    "...": "other field values"
  }
}
```
Field keys inside `contentlet` are the content type's field `variable` names (e.g., `title`, `body`, `image`). Unknown field names are silently dropped (a typo like `titel` will be ignored and may surface as a misleading 'title is required' error). Radio/Select/Checkbox values are not validated against the field's `values` list — out-of-range values are accepted as-is. Always verify spelling against `fields[].variable` from `GET /api/v1/contenttype/id/{idOrVar}`.

**Validation error response shape:**

```json
{
  "entity": "",
  "errors": [{ "errorCode": "required", "fieldName": "image", "message": "The field Image is required." }],
  "i18nMessagesMap": {}, "messages": [], "pagination": null, "permissions": []
}
```
`errorCode` values: `required`, `unknown`. `fieldName` is the field `variable` for field-specific errors, or `null` for content-level errors. Note: when the content type is not found, `message` returns the raw translation key `Workflow-does-not-exists-content-type` instead of translated text.

**Binary and image fields** — These fields cannot receive raw file data or asset paths in the JSON body. Use one of the patterns below.

**Pattern A — single-use file (works for all binary/image fields):**

1. `POST /api/v1/temp` (multipart `file` part) OR `POST /api/v1/temp/byUrl` (JSON `{"remoteUrl":"https://..."}`) → use `tempFiles[0].id` (e.g. `"temp_5311313004"`) as the field value.
2. Pass that ID in the contentlet body: `{"contentlet": {"contentType": "ResortActivities", "image": "temp_5311313004", ...}}`.

**Pattern B — reusable shared asset (`ImmutableImageField` only):**

1. Upload via `/temp`, create a dotAsset contentlet: `PUT .../fire/PUBLISH` with `{"contentlet": {"contentType": "dotAsset", "asset": "temp_<id>"}}`.
2. Use the returned dotAsset `identifier` as the field value on any `ImmutableImageField`.

| Field `clazz` | `temp_<id>` | dotAsset `identifier` |
|---|---|---|
| `ImmutableBinaryField` | ✅ | ❌ (returns 400 \"field is required\") |
| `ImmutableImageField` | ✅ | ✅ |

Find a field's `clazz` by calling `GET /api/v1/contenttype/id/{idOrVar}` and reading `fields[].clazz`.

⚠️ **Known issue:** Firing `PUBLISH` on an archived contentlet (`archived: true`) does not validate the archived state and can produce an inconsistent `live: true, archived: true` tri-state. Always fire `UNARCHIVE` before `PUBLISH` on archived content.

⚠️ **Multi-scheme content types:** When a content type has multiple workflow schemes attached, firing a system action only initializes the contentlet into the scheme whose `systemActionMappings` entry resolved the fire. Other attached schemes will not have a task for that contentlet, and firing their actions later will fail with 'Workflow Action is not available in the Workflow Step the content is currently in.' To exercise actions in those other schemes, fire by action ID via `PUT /api/v1/workflow/actions/{actionId}/fire` using an action mapped to the desired scheme.

**When chaining workflow actions or reading state back immediately after firing, pass `indexPolicy=WAIT_FOR` on each call.** The default `DEFER` is asynchronous and can return stale index reads for several seconds, which can mimic server-side state bugs. For isolated one-off fires where nothing reads the result, leave the default.

## Path parameters

- `systemAction` 'NEW' | 'EDIT' | 'PUBLISH' | 'UNPUBLISH' | 'ARCHIVE' | 'UNARCHIVE' | 'DELETE' | 'DESTROY', required

## Query parameters

- `inode` string
- `identifier` string
- `indexPolicy` 'DEFER' | 'WAIT_FOR' | 'FORCE'
- `language` string
- `variantName` string

## Request body

- FireActionByNameForm
  - `comments` string
  - `assign` string
  - `publishDate` string
  - `publishTime` string
  - `expireDate` string
  - `expireTime` string
  - `neverExpire` string
  - `whereToSend` string
  - `filterKey` string
  - `query` string
  - `pathToMove` string
  - `timezoneId` string
  - `individualPermissions` object
  - `actionName` string
  - `iwantTo` string
  - `contentlet` object

## Response `200`

Fired action successfully

- ResponseEntityMapView
  - `errors` ErrorEntity[]
    - `errorCode` string
    - `message` string
    - `fieldName` string
  - `entity` object
  - `messages` MessageEntity[]
    - `message` string
  - `i18nMessagesMap` object
  - `permissions` string[]
  - `pagination` Pagination
    - `currentPage` integer
    - `perPage` integer
    - `totalEntries` integer

## Other responses

- `400` — Validation error. `errors[].errorCode` values: `required` (a required field is missing), `unknown` (unknown content type — `message` returns the raw translation key `Workflow-does-not-exists-content-type`). `fieldName` is the field `variable` for field-specific errors, or `null` otherwise.
- `401` — Invalid User
- `403` — Forbidden
- `404` — Content not found
- `406` — Not Acceptable
- `415` — Unsupported Media Type
- `500` — Internal Server Error

---

[API](https://skmtc.dev/jostens/apis/dotcms-rest-api.md) · [All operations](https://skmtc.dev/jostens/apis/dotcms-rest-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/jostens/dotcms-rest-api/revisions/a088fe9f515c/schema)
