Zernio
APIFor you
Zernio
APIFor you
API Reference

Posts

List postsGETCreate postPOSTGet postGETUpdate post metadataPOSTUpdate postPUTDelete postDELETEUnpublish postPOSTBulk upload from CSVPOSTRetry failed postPOSTEdit published postPOSTApprove or reject a postPOST
Dashboard
OverviewPlatformsAPI ReferenceResources
Posts

Approve or reject a post

Approves or rejects a post saved with requiresApproval: true (status pending_approval). approve schedules the post for its scheduledFor and fires the post.scheduled webhook. When that time has already passed, the post publishes within a couple of minutes. reject returns the post to draft. Returns 409 when the post is not pending_approval.


POST
/v1/posts/{postId}/review

Authorization

bearerAuth
AuthorizationBearer <token>

API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.

In: header

Path Parameters

postId*string

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.posts.reviewPost({  path: {    postId: 'post_abc123',  },  body: {    decision: 'approve',  },});console.log(data);
{  "post": {    "_id": "string",    "userId": "string",    "title": "string",    "content": "string",    "mediaItems": [      {        "type": "image",        "url": "http://example.com",        "title": "string",        "altText": "string",        "filename": "string",        "size": 0,        "mimeType": "string",        "thumbnail": "http://example.com",        "instagramThumbnail": "http://example.com",        "subtitles": [          {            "url": "http://example.com",            "language": "string"          }        ],        "tiktokProcessed": true      }    ],    "platforms": [      {        "platform": "string",        "accountId": "string",        "customContent": "string",        "customMedia": [          {            "type": "image",            "url": "http://example.com",            "title": "string",            "altText": "string",            "filename": "string",            "size": 0,            "mimeType": "string",            "thumbnail": "http://example.com",            "instagramThumbnail": "http://example.com",            "subtitles": [              {                "url": "http://example.com",                "language": "string"              }            ],            "tiktokProcessed": true          }        ],        "scheduledFor": "2019-08-24T14:15:22Z",        "platformSpecificData": {},        "status": "string",        "platformPostId": "string",        "platformPostUrl": "string",        "publishedAt": "2019-08-24T14:15:22Z",        "removedFromPlatformAt": "2019-08-24T14:15:22Z",        "isTrialReel": true,        "trialGraduationStrategy": "MANUAL",        "publishAttempts": 0,        "publishRetries": 0,        "errorMessage": "string",        "errorCategory": "auth_expired",        "errorSource": "user",        "platformError": {          "code": 0,          "subcode": 0,          "message": "string"        }      }    ],    "scheduledFor": "2019-08-24T14:15:22Z",    "timezone": "string",    "status": "draft",    "tags": [      "string"    ],    "hashtags": [      "string"    ],    "mentions": [      "string"    ],    "visibility": "public",    "metadata": {},    "recycling": {      "enabled": true,      "gap": 0,      "gapFreq": "week",      "startDate": "2019-08-24T14:15:22Z",      "expireCount": 0,      "expireDate": "2019-08-24T14:15:22Z",      "contentVariations": [        "string"      ],      "contentVariationIndex": 0,      "recycleCount": 0,      "nextRecycleAt": "2019-08-24T14:15:22Z",      "lastRecycledAt": "2019-08-24T14:15:22Z"    },    "recycledFromPostId": "string",    "queuedFromProfile": "string",    "queueId": "string",    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z"  }}
Was this page helpful?

Edit published post

Edit the text of an already-published post. Supported on X, Discord, Facebook, Reddit, LinkedIn, Telegram, Pinterest, Google Business Profile, YouTube, and Slack. When a post was published to several accounts on the same platform, pass `accountId` to pick which account's copy to edit (without it the request returns 409). Each platform enforces its own rules: **X** - Connected X account must have an active X Premium subscription - Must be within 1 hour of original publish time - Maximum 5 edits per tweet (enforced by X) - Threads cannot be edited, only single tweets - X assigns a NEW post ID on edit, returned as `id` **Discord** - No time limit and no premium requirement - The message ID is unchanged after the edit **Facebook** - Graph only permits editing a post that the same app created, so this works on posts published through Zernio and is rejected for posts created in Meta Business Suite / Composer or by another tool - Media cannot be swapped, only the message text - Reactions, comments, and shares are preserved. The post ID is unchanged **Reddit** - Self-posts only. A link post has no editable body and is rejected before the write - Body only. Reddit exposes no API to edit a post title, ever - The post ID is unchanged **LinkedIn** - Text only, no time limit. Media, polls, articles, and reshare targets cannot be changed - Works for member and organization posts published through this API. The post keeps its ID and LinkedIn shows an "edited" marker - Text is limited to 3,000 characters; mentions and hashtags are preserved **Telegram** - No time limit; messages published through Zernio are editable indefinitely - Text posts: edits the message text (up to 4096 characters) - Media posts: edits the caption only (up to 1024 characters). The media itself cannot be swapped - For albums, the caption shown on the album (its first message) is edited - The message ID is unchanged **Pinterest** - Description only, maximum 800 characters. Media, link, and board cannot be changed, and a pin title derived from the old content's first line at publish stays as-is - Pinterest's pin-update endpoint is currently in closed beta; until the app is allowlisted by Pinterest, edits are rejected with a "beta feature not yet enabled" error - The pin ID is unchanged **Google Business Profile** - Post body (summary) text only. Call-to-action, event/offer fields, and media are untouched - No time limit and no edit limit. The post ID is unchanged - The post must still exist on Google: a post deleted from the Business Profile dashboard, or an event/offer post past its end date, returns a 404 **YouTube** - `content` replaces the video description only. The title is unchanged, even if it was originally derived from the content's first line at publish time - Title, tags, thumbnail, and privacy edits belong to `POST /v1/posts/{postId}/update-metadata` - No time window and no edit cap. The video ID is unchanged **Slack** - Text only, up to 4,000 characters. Media cannot be swapped, and media posts whose share message reference never resolved cannot be edited - No time limit unless workspace admins restrict message editing - The message ID is unchanged Media edits are not supported on any platform. The post record in Zernio is updated with the new content and an edit-history entry.

List schedules

Returns queue schedules for a profile. Use all=true for all queues, or queueId for a specific one. Defaults to the default queue.

decision*string

approve schedules the post; reject returns it to draft.

Value in

  • "approve"
  • "reject"