---
title: "Validate schedule"
method: POST
path: "/v1/posts/validate"
tags: ["Publishing Runs and Posts"]
---

# Validate schedule

`POST /v1/posts/validate`

## Request

- Base URL: `https://getsocialclaw.com`
- URL: `https://getsocialclaw.com/v1/posts/validate`
- Auth: HTTP bearer

Validates and normalizes a posts[] or campaigns[] schedule without creating a run.

Note: Use this before handing a generated schedule to /v1/posts/apply.

Note: The route accepts either the schedule object directly or { schedule: ... }.

## Request body

- ScheduleEnvelope: Schedule document accepted by validation, preview, apply, and dashboard compose workflows.
  - `timezone` string: IANA timezone. Defaults to UTC.
  - `mode` 'scheduled' | 'draft': scheduled creates runnable posts; draft creates an editable draft run.
  - `idempotencyKey` string, nullable: Optional idempotency key. Also accepted as idempotency_key.
  - `posts` PostInput[]: Flat list of posts.
    - `provider` 'x' | 'threads' | 'meta' | 'facebook' | 'instagram_business' | 'instagram' | 'snapchat' | 'tiktok' | 'linkedin' | 'linkedin_page' | 'pinterest' | 'youtube' | 'reddit' | 'discord' | 'telegram' | 'wordpress' | 'null', nullable: Provider. Optional when account handle identifies the provider.
    - `account` string, required: Connected account handle or id.
    - `name` string, nullable: Post title, campaign step title, or provider title.
    - `title` string, nullable: Alias for name on providers requiring titles.
    - `description` string, nullable: Primary post text.
    - `text` string, nullable: Alias for description.
    - `publish_at` string, date-time, nullable: Scheduled publish time.
    - `publishAt` string, date-time, nullable: Camel-case alias for publish_at.
    - `media_link` string, nullable: Single public media URL.
    - `mediaLink` string, nullable: Camel-case alias for media_link.
    - `assets` union[]: One or more asset objects or URL strings.
      - union
        - AssetInput: Media asset referenced by a post.
          - `id` string, nullable: Client-side or SocialClaw asset id.
          - `url` string, required: Publicly reachable media URL.
          - `managed` boolean: True when this is a SocialClaw-managed asset.
          - `originalFilename` string, nullable: Original file name.
          - `mime` string, nullable: MIME type.
          - `kind` 'image' | 'video' | 'audio' | 'other' | 'null', nullable
          - `size` integer, nullable: File size in bytes.
          - `duration` number, nullable: Duration in seconds for video/audio.
          - `width` integer, nullable: Media width in pixels.
          - `height` integer, nullable: Media height in pixels.
          - `altText` string, nullable: Alt text where the provider supports it.
        - string, uri
    - `settings` object: Provider-specific settings from the publish settings API. Standalone Instagram supports destination/format plus per-media alt text and people tags, collaborators, Reel cover/thumbnail/feed/audio/Trial controls, AI disclosure, and location IDs. post_and_story requires one asset and creates two independent jobs.
    - `interaction_type` 'post' | 'reply' | 'comment' | 'null', nullable
    - `parent_step_id` string, nullable: Parent step id for reply/thread workflows.
  - `campaigns` CampaignInput[]: Campaign graph model.
    - `id` string, nullable: Campaign id.
    - `name` string, required: Campaign name.
    - `targets` object[], required: Publishing targets.
      - `account` string: Connected account handle.
      - `publish_at` string, date-time, nullable: Base publish time.
      - `steps` PostInput[]: Campaign steps.
        - `provider` 'x' | 'threads' | 'meta' | 'facebook' | 'instagram_business' | 'instagram' | 'snapchat' | 'tiktok' | 'linkedin' | 'linkedin_page' | 'pinterest' | 'youtube' | 'reddit' | 'discord' | 'telegram' | 'wordpress' | 'null', nullable: Provider. Optional when account handle identifies the provider.
        - `account` string, required: Connected account handle or id.
        - `name` string, nullable: Post title, campaign step title, or provider title.
        - `title` string, nullable: Alias for name on providers requiring titles.
        - `description` string, nullable: Primary post text.
        - `text` string, nullable: Alias for description.
        - `publish_at` string, date-time, nullable: Scheduled publish time.
        - `publishAt` string, date-time, nullable: Camel-case alias for publish_at.
        - `media_link` string, nullable: Single public media URL.
        - `mediaLink` string, nullable: Camel-case alias for media_link.
        - `assets` union[]: One or more asset objects or URL strings.
          - union
            - AssetInput: Media asset referenced by a post.
              - …
            - string, uri
        - `settings` object: Provider-specific settings from the publish settings API. Standalone Instagram supports destination/format plus per-media alt text and people tags, collaborators, Reel cover/thumbnail/feed/audio/Trial controls, AI disclosure, and location IDs. post_and_story requires one asset and creates two independent jobs.
        - `interaction_type` 'post' | 'reply' | 'comment' | 'null', nullable
        - `parent_step_id` string, nullable: Parent step id for reply/thread workflows.
  - `schedule` object: Optional wrapper. Routes accept either the envelope directly or { schedule: envelope }.

## Response `200`

Successful response.

- ValidateResponse: Schedule validation response.
  - `ok` unknown, required
  - `tenantId` string, required: Workspace id.
  - `timezone` string, required: Resolved timezone.
  - `mode` string, required: Resolved mode.
  - `sourceModel` string: posts_v1 or campaigns_v2.
  - `totalCampaigns` integer: Campaign count.
  - `totalPosts` integer, required: Post count.
  - `posts` PostInput[], required: Prepared posts.
    - `provider` 'x' | 'threads' | 'meta' | 'facebook' | 'instagram_business' | 'instagram' | 'snapchat' | 'tiktok' | 'linkedin' | 'linkedin_page' | 'pinterest' | 'youtube' | 'reddit' | 'discord' | 'telegram' | 'wordpress' | 'null', nullable: Provider. Optional when account handle identifies the provider.
    - `account` string, required: Connected account handle or id.
    - `name` string, nullable: Post title, campaign step title, or provider title.
    - `title` string, nullable: Alias for name on providers requiring titles.
    - `description` string, nullable: Primary post text.
    - `text` string, nullable: Alias for description.
    - `publish_at` string, date-time, nullable: Scheduled publish time.
    - `publishAt` string, date-time, nullable: Camel-case alias for publish_at.
    - `media_link` string, nullable: Single public media URL.
    - `mediaLink` string, nullable: Camel-case alias for media_link.
    - `assets` union[]: One or more asset objects or URL strings.
      - union
        - AssetInput: Media asset referenced by a post.
          - `id` string, nullable: Client-side or SocialClaw asset id.
          - `url` string, required: Publicly reachable media URL.
          - `managed` boolean: True when this is a SocialClaw-managed asset.
          - `originalFilename` string, nullable: Original file name.
          - `mime` string, nullable: MIME type.
          - `kind` 'image' | 'video' | 'audio' | 'other' | 'null', nullable
          - `size` integer, nullable: File size in bytes.
          - `duration` number, nullable: Duration in seconds for video/audio.
          - `width` integer, nullable: Media width in pixels.
          - `height` integer, nullable: Media height in pixels.
          - `altText` string, nullable: Alt text where the provider supports it.
        - string, uri
    - `settings` object: Provider-specific settings from the publish settings API. Standalone Instagram supports destination/format plus per-media alt text and people tags, collaborators, Reel cover/thumbnail/feed/audio/Trial controls, AI disclosure, and location IDs. post_and_story requires one asset and creates two independent jobs.
    - `interaction_type` 'post' | 'reply' | 'comment' | 'null', nullable
    - `parent_step_id` string, nullable: Parent step id for reply/thread workflows.
  - `campaign` object, nullable
  - `schedule` object, nullable

## Other responses

- `400`: Invalid request.
- `401`: Missing, invalid, or unauthorized credentials.
- `404`: Requested resource was not found.
- `422`: Request body or semantic validation failed.

---

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