---
title: "Validate post content"
method: POST
path: "/v1/tools/validate/post"
tags: ["Validate"]
---

# Validate post content

`POST /v1/tools/validate/post`

Dry-run the full post validation pipeline without publishing. Catches issues like missing media for Instagram/TikTok/YouTube, hashtag limits, invalid thread formats, Facebook Reel requirements, and character limit violations.

Accepts the same body as POST /v1/posts. Does NOT validate accounts, process media, or track usage. Account lookups are limit-only: a twitter accountId is resolved, scoped to the caller, only to pick the 280 vs 25000 character limit. Missing, foreign, or invalid ids fall back to 280 and never error.

Returns errors for failures and warnings for near-limit content (>90% of character limit).

## Request body

- object
  - `content` string — Post text content
  - `platforms` object[], required — Target platforms (same format as POST /v1/posts)
    - `platform` 'twitter' | 'instagram' | 'tiktok' | 'youtube' | 'facebook' | 'linkedin' | 'bluesky' | 'threads' | 'reddit' | 'pinterest' | 'telegram' | 'snapchat' | 'googlebusiness' | 'discord' | 'slack', required
    - `accountId` string — Account to validate against. For twitter, resolves X Premium status to apply the 25000 character limit instead of 280.
    - `customContent` string
    - `platformSpecificData` object
    - `customMedia` MediaItem[]
      - `type` 'image' | 'video' | 'gif' | 'document'
      - `url` string, uri
      - `title` string — Optional title for the media item. Used as the document title for LinkedIn PDF/carousel posts. If omitted, falls back to the post title, then the filename.
      - `altText` string — Accessibility alternative text for an image, applied on every platform that supports it: Instagram (feed images only, not Reels/Stories), Facebook, Threads, X/Twitter (max 1000 chars), LinkedIn, Bluesky, and Pinterest (max 500 chars). Ignored on platforms without alt-text support (TikTok, YouTube, Snapchat, Telegram, Reddit, Google Business, WhatsApp) and on video items where the platform does not accept it. Set once per image; the same value is sent to each selected platform.
      - `filename` string
      - `size` integer — Optional file size in bytes
      - `mimeType` string — Optional MIME type (e.g. image/jpeg, video/mp4)
      - `thumbnail` string, uri — Optional custom thumbnail/cover image URL for videos. Supported for Facebook video posts, Facebook Reels, regular video uploads, and LinkedIn video posts. Max 10MB, JPG/PNG recommended.
      - `instagramThumbnail` string, uri — Custom cover image URL for Instagram Reels. Can also be set via platformSpecificData.instagramThumbnail or platformSpecificData.reelCover. Resolution order: this field > platformSpecificData.instagramThumbnail > platformSpecificData.reelCover > platformSpecificData.thumbnailUrl (legacy).
      - `tiktokProcessed` boolean — Internal flag indicating the image was resized for TikTok
  - `mediaItems` MediaItem[] — Root media items shared across platforms
    - `type` 'image' | 'video' | 'gif' | 'document'
    - `url` string, uri
    - `title` string — Optional title for the media item. Used as the document title for LinkedIn PDF/carousel posts. If omitted, falls back to the post title, then the filename.
    - `altText` string — Accessibility alternative text for an image, applied on every platform that supports it: Instagram (feed images only, not Reels/Stories), Facebook, Threads, X/Twitter (max 1000 chars), LinkedIn, Bluesky, and Pinterest (max 500 chars). Ignored on platforms without alt-text support (TikTok, YouTube, Snapchat, Telegram, Reddit, Google Business, WhatsApp) and on video items where the platform does not accept it. Set once per image; the same value is sent to each selected platform.
    - `filename` string
    - `size` integer — Optional file size in bytes
    - `mimeType` string — Optional MIME type (e.g. image/jpeg, video/mp4)
    - `thumbnail` string, uri — Optional custom thumbnail/cover image URL for videos. Supported for Facebook video posts, Facebook Reels, regular video uploads, and LinkedIn video posts. Max 10MB, JPG/PNG recommended.
    - `instagramThumbnail` string, uri — Custom cover image URL for Instagram Reels. Can also be set via platformSpecificData.instagramThumbnail or platformSpecificData.reelCover. Resolution order: this field > platformSpecificData.instagramThumbnail > platformSpecificData.reelCover > platformSpecificData.thumbnailUrl (legacy).
    - `tiktokProcessed` boolean — Internal flag indicating the image was resized for TikTok

## Response `200`

Validation result

- union
  - object — Valid post
    - `valid` boolean
    - `message` string
    - `warnings` object[]
      - `platform` string
      - `warning` string
  - object — Invalid post
    - `valid` boolean
    - `errors` object[]
      - `platform` string
      - `error` string
    - `warnings` object[]
      - `platform` string
      - `warning` string

## Other responses

- `401` — Unauthorized

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/revisions/ac5fffe58a63/schema)
