---
title: "Set or clear the workflow state of several library posts in one request."
method: PUT
path: "/v2/scheduler/library/posts/state"
tags: ["Library Posts State Api Service"]
---

# Set or clear the workflow state of several library posts in one request.

`PUT /v2/scheduler/library/posts/state`

## Request

- Base URL: `https://app.metricool.com/api`
- URL: `https://app.metricool.com/api/v2/scheduler/library/posts/state`
- Auth: none declared

Best-effort: ids that do not resolve to a live post of the brand come back in 'failures' and do not stop the rest of the selection from moving. Every post that actually changes state records it in its activity history; one already in the target state is returned as succeeded without an entry. At most 500 ids per request.

## Request body

- BulkUpdateLibraryPostStateRequest: Body to set or clear the workflow state of several library posts at once.
  - `postIds` integer[], required: Ids of the library posts to move. Must not be empty; duplicates are collapsed.
  - `stateId` integer: Workflow state id to set on every post; null (or omitted) to move them to 'Sin asignar'.

## Response `200`

Request processed. Partial success lives here too: 'succeeded' and 'failures' coexist in the same 200 response.

- JsonOkResponseBulkUpdateLibraryPostStateResult
  - `metadata` object
  - `page` JsonPaging
    - `next` string
  - `data` BulkUpdateLibraryPostStateResult: Outcome of a bulk workflow state change, split into the posts that moved and the ids that could not.
    - `succeeded` LibraryPostDto[]: The posts now sitting in the target state, with their state resolved. Includes posts that were already in it.
      - `id` integer
      - `creationDate` DateTimeInfo
        - `dateTime` string, required: Local Date-time represented with a certain timezone
        - `timezone` string: Timezone applied to the datetime
      - `updatedDate` DateTimeInfo
        - `dateTime` string, required: Local Date-time represented with a certain timezone
        - `timezone` string: Timezone applied to the datetime
      - `shortener` boolean
      - `draft` boolean
      - `commonData` LibraryPostCommonConfigurationDto
        - `content` string, required
        - `firstCommentText` string
        - `publishMode` string
        - `smartlinkData` SmartlinkData
          - `targetUrl` string
          - `ids` integer[]
      - `media` LibraryPostMediaDto[]
        - `id` integer
        - `position` integer, required
        - `url` string
        - `altText` string
        - `videoCoverMilliseconds` integer
        - `videoThumbnailUrl` string
      - `saveExternalMediaFiles` boolean
      - `parentId` integer
      - `twitterData` TwitterConfigurationDto
        - `enabled` boolean
        - `tags` string[]
        - `replySettings` string
        - `type` string
        - `poll` ScheduledPostTwitterPoll
          - `options` ScheduledPostTwitterPollOption[]
            - `text` string
          - `settings` ScheduledPostTwitterPollSettings
            - `durationMinutes` integer
      - `facebookData` FacebookConfigurationDto
        - `enabled` boolean
        - `boostBudget` number
        - `boostPayer` string
        - `boostBeneficiary` string
        - `location` LibraryPostLocationDto
          - `name` string
          - `link` string
          - `id` string
          - `locationCoordinates` LibraryPostLocationCoordinates
            - `city` string
            - `country` string
            - `state` string
            - `street` string
            - `zip` string
            - `latitude` number, double
            - `longitude` number, double
        - `type` string
        - `reelTitle` string
      - `instagramData` InstagramConfigurationDto
        - `enabled` boolean
        - `carouselTags` object
        - `carouselProductTags` object
        - `type` string
        - `showReelOnFeed` boolean
        - `isAiGenerated` boolean: Whether the Instagram post is flagged as AI-generated content (sent as is_ai_generated on publish).
        - `boostBudget` number
        - `boostPayer` string
        - `boostBeneficiary` string
        - `location` LibraryPostLocationDto
          - `name` string
          - `link` string
          - `id` string
          - `locationCoordinates` LibraryPostLocationCoordinates
            - `city` string
            - `country` string
            - `state` string
            - `street` string
            - `zip` string
            - `latitude` number, double
            - `longitude` number, double
        - `reelAudioName` string
        - `collaborators` InstagramCollaboratorTag[]
          - `username` string
          - `deleted` boolean
        - `shareTrialAutomatically` boolean
        - `audioConfiguration` InstagramAudioConfigurationDto
          - `audioId` string, required: Unique identifier of the audio asset from the Instagram Audio API.
          - `audioType` 'music' | 'original_sound' | 'music' | 'original_sound': Audio type. Allowed values: 'music', 'original_sound'.
          - `title` string: Title of the audio track.
          - `displayArtist` string: Display artist name (populated for 'music' type).
          - `igUsername` string: Instagram username of the creator (populated for 'original_sound' type).
          - `coverArtworkUrl` string: URL of the cover artwork thumbnail.
          - `durationMs` integer: Duration of the audio in milliseconds.
          - `audioVolume` integer: Volume level for the audio asset, from 0 (muted) to 100 (full volume). Defaults to 100.
          - `videoVolume` integer: Volume level for the video's original audio, from 0 (muted) to 100 (full volume). Defaults to 100.
      - `threadsData` ThreadsConfigurationDto
        - `enabled` boolean: A boolean that represents if the Threads configuration is enabled for this library post
        - `allowedCountryCodes` string[]: A string list of valid ISO 3166-1 alpha-2 country codes that represents the countries where this media should be shown.
        - `replyControl` string: A string that represents who can reply to a Threads post, been EVERYONE by default. (EVERYONE, ACCOUNTS_YOU_FOLLOW,MENTIONED_ONLY,PARENT_POST_AUTHOR_ONLY,FOLLOWERS_ONLY)
        - `type` string: Post type (POST or GHOST)
        - `shareAsInstagramStory` boolean: A boolean that represents if the Threads post must be cross-shared as an Instagram Story. The Story is published on the Instagram account linked to the Threads account, which may not match the Instagram account connected to this brand.
        - `instagramStoryTheme` string: Theme used when the Threads post is cross-shared as an Instagram Story (LIGHT or DARK). Only allowed when shareAsInstagramStory is enabled; must be absent otherwise.
        - `isSpoiler` boolean: A boolean that represents if isSpoiler is activated or not
      - `linkedinData` LinkedinConfigurationDto
        - `enabled` boolean
        - `documentTitle` string
        - `publishImagesAsPDF` boolean, required
        - `previewIncluded` boolean, required
        - `type` string
        - `poll` LinkedinPollDto
          - `question` string
          - `options` LinkedinOptionDto[]
            - `text` string
          - `settings` LinkedinSettingsDto
            - `duration` string
      - `pinterestData` PinterestConfigurationDto
        - `enabled` boolean
        - `boardId` string
        - `pinTitle` string
        - `pinLink` string
        - `pinNewFormat` boolean
      - `tiktokData` TikTokConfigurationDto
        - `enabled` boolean
        - `disableComment` boolean
        - `disableDuet` boolean
        - `disableStitch` boolean
        - `privacyOption` string
        - `commercialContentThirdParty` boolean
        - `commercialContentOwnBrand` boolean
        - `title` string
        - `autoAddMusic` boolean
        - `photoCoverIndex` integer
        - `music` TikTokTrackDto
          - `musicId` string
          - `title` string
          - `author` string
          - `previewUrl` string
          - `thumbnailUrl` string
          - `soundVolume` integer
          - `originalVolume` integer
          - `startMillis` integer
          - `endMillis` integer
        - `isAigc` boolean
      - `youtubeData` YoutubeConfigurationDto
        - `enabled` boolean
        - `title` string
        - `type` string
        - `privacy` string
        - `tags` string[]
        - `category` string
        - `madeForKids` boolean
        - `playlistId` string
        - `isAiGeneratedContent` boolean
        - `notifySubscribers` boolean
      - `gbpData` GbpConfigurationDto
        - `enabled` boolean
        - `type` string
      - `blueskyData` BlueskyConfigurationDto
        - `enabled` boolean
        - `postLanguages` string[]
      - `descendants` LibraryPostDto[]
      - `notes` LibraryPostNoteDto[]
        - `id` integer, required
        - `libraryPostId` integer, required
        - `userId` integer
        - `agencyId` integer
        - `agencyUserId` integer
        - `userName` string, required
        - `created` DateTimeInfo, required
          - `dateTime` string, required: Local Date-time represented with a certain timezone
          - `timezone` string: Timezone applied to the datetime
        - `content` string, required
        - `updatedDate` DateTimeInfo
          - `dateTime` string, required: Local Date-time represented with a certain timezone
          - `timezone` string: Timezone applied to the datetime
        - `updated` boolean
        - `deleted` boolean
        - `profilePicture` string: Public URL of the author's 400x400 profile picture. Absent when they have none, in which case the frontend renders its initials fallback. Filled for agency-authored notes too.
        - `mentions` NoteMentionDto[]: Users mentioned in the content of the note, resolved when the note is read. Empty when the note mentions nobody.
          - `userId` integer: Regular user id of the mentioned user. Absent for an agency end client.
          - `agencyId` integer: Agency id of the mentioned user. Only for an agency end client.
          - `agencyUserId` integer: Agency user id of the mentioned user. Only for an agency end client.
          - `name` string: Current display name of the mentioned user. Absent when the account was deleted, in which case the frontend renders its own localized deleted-user label.
          - `deleted` boolean: True when the mentioned account no longer exists. A user that merely lost access to the brand is not deleted: their mention keeps rendering as it always did.
        - `mentionId` string: Identity of the note author, and the field to compare against your own to tell whether a note is yours. `12345` for a regular user, `a:<agencyId>:<agencyUserId>` for an agency end client. Prefer it over the raw id fields: an agency author has no `userId` at all, so comparing that one answers "not mine" on their own note. Same shape as the `mentionId` of the mention picker, so the author of a note and the entry that mentions them carry the same string. Absent only for a note whose author could not be resolved.
      - `hasNotReadNotes` boolean
      - `tags` string
      - `performanceDashboardIds` integer[]
      - `assignee` LibraryPostAssigneeDto: Team member assigned to a library post.
        - `label` 'CLIENT' | 'STAFF': Badge to show next to the user, relative to the requesting session: CLIENT (an agency end client, as seen by a Metricool session), STAFF (anyone who is not an agency end client, as seen by an agency end-client session), or absent for no badge.
        - `userId` integer: Regular user id of the assignee. Absent for an agency end client.
        - `agencyId` integer: Agency id of the assignee. Only for an agency end client.
        - `agencyUserId` integer: Agency user id of the assignee. Only for an agency end client.
        - `name` string: Display name of the assignee, or null when it cannot be resolved.
        - `deleted` boolean: True when the assignee account has been deleted (frontend shows 'deleted user').
        - `hasBrandAccess` boolean: False when the assignee no longer has access to this brand (frontend shows a warning).
        - `profilePicture` string: Absolute URL of the assignee's profile picture. Omitted when it has none; the UI then renders its initials. Filled for both assignee kinds (ES5MPTM3-7292).
      - `state` LibraryPostStateDto: A workflow state of a library post.
        - `id` integer: State id.
        - `name` string: Display name of the state.
        - `color` string: Color of the state.
        - `position` integer: Ordering position of the state within the brand's workflow (ascending).
    - `failures` LibraryPostBulkStateFailure[]: Ids that could not be moved, each with its reason. Empty when everything moved.
      - `postId` integer: The id as it was submitted.
      - `reason` 'NOT_FOUND': Why a post listed in a bulk workflow state change could not be moved.

## Other responses

- `400`: Invalid selection: postIds empty, over 500 ids, or containing a null or non-positive id.
- `403`: User not authorized on the brand.
- `404`: State not found for this brand. No post is moved.

---

[API](https://skmtc.dev/metricool/apis/metricool-api.md) · [All operations](https://skmtc.dev/metricool/apis/metricool-api/llms.txt) · [OpenAPI document](https://skmtc.dev/metricool/apis/metricool-api/revisions/aea9d9a8415a?raw)
