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.
https://post.adaptlypost.com/post/api/v1/social-posts/validateRun 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.
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
| Field | Description |
|---|---|
valid | false when any issue has severity ERROR, at the top level or under an account |
outcome | What creating the post would do: PUBLISH_NOW, SCHEDULED or DRAFT |
scheduledAt | When the post would go out (ISO 8601). Set only when outcome is SCHEDULED |
requiredPermissions | The permissions creating the post would need, such as posts.schedule |
issues | Problems not tied to one account, such as a missing permission |
accounts | One entry per selected account, with the fields below |
notChecked | What 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
| Field | Description |
|---|---|
platform, connectionId, accountName | The account's platform, its connection ID and its name when known |
status | READY, WARNING (goes out with a caveat) or BLOCKED (would not go out) |
issues | The problems found for this account |
Issue fields
| Field | Description |
|---|---|
code | A 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 |
severity | ERROR stops the post, or that account, from going out. WARNING lets it through |
message | A readable sentence you can show as is |
platform, connectionId | The 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.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"]
}'{
"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"
}
]
}