Skip to Content
API ReferenceUpload MediaValidate (Dry Run)

Validate a Post (Dry Run)

Checks a post the way publishing would, but publishes nothing: no post is created, nothing is queued, no file is stored. Use it before a bulk post, or in an automation, to catch an error now rather than hours later when a scheduled post fails.

Endpoint

POST /api/v1/upload/validate

Same multipart/form-data body as Bulk Upload: send exactly what you would send to /upload/bulk. Requires x-api-key.

What is checked

  • Each account exists, belongs to you (or your team) and is active.
  • Your plan includes the platform.
  • Monthly quota, daily cap per account, and room in your publishing queue.
  • Caption and title length for each platform, banned hashtags.
  • Required media: text-only posts only go to Facebook, LinkedIn, Bluesky and Threads.
  • Platform-specific settings (for example YouTube title, tags and privacy).

Not checked: the media content itself (format, duration, resolution). That happens when the post is published.

Response

{ "success": true, "valid": false, "errors": [ { "accountId": "cmf3kb7re0004l408zt2m5wxc", "platform": "bluesky", "error": "Bluesky post exceeds the 300-grapheme / 3000-byte limit." } ], "targets": [ { "accountId": "cmf3k9x2a0001l408q7vbn2hd", "platform": "tiktok", "scheduledFor": null } ] }
  • valid is true only when every account would accept the post.
  • errors lists each account that would reject it. An error with accountId: null applies to the whole request (for example, the monthly quota is used up).
  • targets lists the accounts that would accept it, with the scheduled time if you sent schedule_date.

Example Request

curl -X POST https://api.multi-upload-tool.com/api/v1/upload/validate \ -H "x-api-key: YOUR_API_TOKEN" \ -F 'accounts=["cmf3k9x2a0001l408q7vbn2hd", "cmf3kb7re0004l408zt2m5wxc"]' \ -F "photo=https://example.com/image.jpg" \ -F "description=Launch day! #newproduct"

Over MCP, the same check is the validate_post tool, which takes the same arguments as create_post.