REST APIPOST

Check a Bulk Schedule

Dry-run a bulk schedule: send the same body as Bulk Schedule and get one report per post, in request order, without creating any post.

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

Check a whole bulk schedule without creating any post. Send the same body as Bulk Schedule and get one report per post, in request order.

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

posts.draft is enough to run the check. Each report's requiredPermissions names what scheduling that post would need.

Request body

The same body as Bulk Schedule, with up to 100 posts. Batch-level configs apply to every post and per-post configs override them, just as when scheduling. Nothing is created or stored.

Response fields

FieldDescription
validtrue only when every post is valid
totalValidHow many posts have no ERROR issue
totalInvalidHow many posts have at least one ERROR issue
resultsOne entry per post as { index, report }. index is the post's position in posts, starting at 0. report has the same fields as the Check Post response

Check before you schedule

Bulk Schedule schedules every valid post even when others fail. Fix the posts whose report is not valid first, and the whole batch goes out as planned.
Check a Bulk Schedule
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/social-posts/bulk/validate \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
    "platforms": ["TWITTER"],
    "timezone": "America/New_York",
    "twitterConnectionIds": ["conn_abc123"],
    "posts": [
      {
        "contentType": "TEXT",
        "text": "Tip of the week: batch your posts on Mondays.",
        "scheduledAt": "2026-11-02T14:00:00Z"
      },
      {
        "contentType": "TEXT",
        "text": "<a 320-character announcement>",
        "scheduledAt": "2026-11-04T14:00:00Z"
      }
    ]
  }'
200
{
  "valid": false,
  "totalValid": 1,
  "totalInvalid": 1,
  "results": [
    {
      "index": 0,
      "report": {
        "valid": true,
        "outcome": "SCHEDULED",
        "scheduledAt": "2026-11-02T14:00:00.000Z",
        "requiredPermissions": ["posts.schedule"],
        "issues": [],
        "accounts": [
          {
            "platform": "TWITTER",
            "connectionId": "conn_abc123",
            "accountName": "@yourhandle",
            "status": "READY",
            "issues": []
          }
        ],
        "notChecked": []
      }
    },
    {
      "index": 1,
      "report": {
        "valid": false,
        "outcome": "SCHEDULED",
        "scheduledAt": "2026-11-04T14:00:00.000Z",
        "requiredPermissions": ["posts.schedule"],
        "issues": [],
        "accounts": [
          {
            "platform": "TWITTER",
            "connectionId": "conn_abc123",
            "accountName": "@yourhandle",
            "status": "BLOCKED",
            "issues": [
              {
                "code": "TEXT_TOO_LONG",
                "severity": "ERROR",
                "message": "Text exceeds maximum length for Twitter/X. Maximum is 280 characters",
                "platform": "TWITTER",
                "connectionId": "conn_abc123"
              }
            ]
          }
        ],
        "notChecked": []
      }
    }
  ]
}