REST APIPOST

Check a Post Before Creating It

Dry-run a post: send the same body as Create Post and get every problem that would stop it, per account, without creating anything.

POSThttps://post.adaptlypost.com/post/api/v1/social-posts/validate

Run every check Create Post runs, without creating anything. Send the same body and read back what the post would do and every problem that would stop it.

API Key (Bearer token)
Permission:posts.draftRoles and permissions

posts.draft is enough to run the check, whatever the post would do. requiredPermissions in the answer names what creating the post would need, and a key that lacks one gets a PERMISSION_DENIED issue.

Request body

The same body as Create Post, field for field. Nothing is created, no media is uploaded and nothing is stored. A well-formed body always answers 200 with a report, even when the post would be refused. Only a malformed body answers 400.

Problems found before publish time

Besides every check Create Post runs, the report covers problems that would otherwise show up only when the post goes out: TikTok creator limits, the daily YouTube upload limit for channels without a backup upload, expired Instagram and Threads access, Mastodon servers that take fewer attachments, Pinterest boards that do not exist and X credits on lifetime deal plans.

Response fields

FieldDescription
validfalse when any issue has severity ERROR, at the top level or under an account
outcomeWhat creating the post would do: PUBLISH_NOW, SCHEDULED or DRAFT
scheduledAtWhen the post would go out (ISO 8601). Set only when outcome is SCHEDULED
requiredPermissionsThe permissions creating the post would need, such as posts.schedule
issuesProblems not tied to one account, such as a missing permission
accountsOne entry per selected account, with the fields below
notCheckedWhat only the platform can decide when the post goes out, as { code, message }. code is PLATFORM_PROCESSING, DUPLICATE_CONTENT, PLATFORM_RATE_LIMITS, LIVE_ACCOUNT_ACCESS or VIDEO_DURATION

Account fields

FieldDescription
platform, connectionId, accountNameThe account's platform, its connection ID and its name when known
statusREADY, WARNING (goes out with a caveat) or BLOCKED (would not go out)
issuesThe problems found for this account

Issue fields

FieldDescription
codeA stable reason such as TEXT_TOO_LONG, ACCOUNT_DISCONNECTED, TIKTOK_POSTING_BLOCKED or YOUTUBE_UPLOAD_QUOTA_EXHAUSTED. New codes can be added, so show message for a code you do not know
severityERROR stops the post, or that account, from going out. WARNING lets it through
messageA readable sentence you can show as is
platform, connectionIdThe platform and account the issue is about, when it is about one

valid: true is not a guarantee

A platform can still reject media while processing it, refuse a duplicate post or hit a rate limit when the post goes out. notChecked lists these. You never need to run the check before Create Post, which runs the same checks again.
Check a Post
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/social-posts/validate \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
    "platforms": ["TWITTER", "TIKTOK"],
    "contentType": "VIDEO",
    "text": "Behind the scenes of our launch",
    "mediaUrls": ["https://cdn.adaptlypost.com/uploads/launch.mp4"],
    "scheduledAt": "2026-11-03T15:00:00Z",
    "timezone": "America/New_York",
    "twitterConnectionIds": ["conn_abc123"],
    "tiktokConnectionIds": ["conn_tt789"]
  }'
200
{
  "valid": false,
  "outcome": "SCHEDULED",
  "scheduledAt": "2026-11-03T15:00:00.000Z",
  "requiredPermissions": ["posts.schedule"],
  "issues": [],
  "accounts": [
    {
      "platform": "TWITTER",
      "connectionId": "conn_abc123",
      "accountName": "@yourhandle",
      "status": "READY",
      "issues": []
    },
    {
      "platform": "TIKTOK",
      "connectionId": "conn_tt789",
      "accountName": "yourbrand",
      "status": "BLOCKED",
      "issues": [
        {
          "code": "TIKTOK_VIDEO_TOO_LONG",
          "severity": "ERROR",
          "message": "Video duration (185s) exceeds your TikTok account limit of 180 seconds",
          "platform": "TIKTOK",
          "connectionId": "conn_tt789"
        }
      ]
    }
  ],
  "notChecked": [
    {
      "code": "PLATFORM_PROCESSING",
      "message": "The platform processes media after upload and can still reject it then"
    }
  ]
}