> Discover all available Postdom documentation from the machine-readable index: https://postdom.com/llms.txt

Reference · validation layers

# Field limits

Every rule names the layer that enforces it. Recorded platform guidance never masquerades as current validation.

Five evidence layers

## Enforcement key

`Schema enforced`

Rejected by the configured callable schema before execution.

`Runtime enforced`

Rejected or constrained by the current API or media path.

`Conditional runtime`

Enforced only when the named production component is active.

`Warning only`

Shown during review without rejecting the request.

`Unvalidated guidance`

Recorded metadata that current request and media validation do not enforce.

Callable and runtime rules

## Enforced limits

Schema and runtime checks can stop a call. Conditional checks require the named production component.

| Surface | Field | Limit | Enforcement |
| --- | --- | --- | --- |
| submit_plan | account_ids | At least one value The adapter resolves each value to a configured connected destination. | Schema enforced |
| submit_plan | title | 1–120 characters Whitespace is trimmed before validation. | Schema enforced |
| submit_plan | objective | 1–1,000 characters Whitespace is trimmed before validation. | Schema enforced |
| submit_plan | max_posts | Integer from 1–20 Defines the plan's maximum authorized post count. | Schema enforced |
| write tools | intent | 1–500 characters Required on submit_plan and publish_video. | Schema enforced |
| write tools | agent_identity | 1–120 characters Optional when the configured client does not provide an identity. | Schema enforced |
| write tools | idempotency_key | Non-empty string Optional to callers. The adapter generates a UUID when omitted. | Schema enforced |
| publish_video | caption | At most 4,000 characters The MCP boundary accepts an empty caption. | Schema enforced |
| upload_media | content_type | video/mp4 or video/quicktime The returned PUT contract requires the same Content-Type header. | Schema enforced |
| upload_media | size_bytes | Integer from 1 byte through 524 MB The returned PUT contract requires the same Content-Length header. | Schema enforced |
| upload_media | platforms | Optional; up to nine unique supported destinations Optional. Postdom validates the requested media against the global limits before issuing a URL, and against each declared destination's limits as well when the list is given; every destination's limits are checked again at publish. | Schema enforced |
| upload_media | workspace request cap | 20 upload contracts per rolling hour The per-workspace cap is reserved atomically before the scoped URL is signed. | Runtime enforced |
| upload_media | workspace byte cap | 2 GB declared per rolling hour The per-workspace byte budget is reserved atomically before the scoped URL is signed. | Runtime enforced |
| publish_video | media source | Exactly one of video_url, media_handle or media A media handle must reach stored through get_media before publication. media is an ordered list of image or video handles (a carousel; TikTok publishes several images as a photo post), accepted by the hosted server at https://api.postdom.com/mcp, not by the published @postdom/mcp@0.4.0. | Schema enforced |
| publish_video | video_url | Syntactically valid URL when supplied Runtime media checks apply after schema validation. | Schema enforced |
| publish_video | media_handle | Valid workspace-scoped pd_media_ handle when supplied Cross-workspace, missing, pending, and failed handles are rejected without revealing another workspace's object. | Runtime enforced |
| plan and publish | datetime fields | RFC 3339 UTC ending in Z Applies to starts_at, ends_at, and optional publish_at. | Schema enforced |
| plan and publish | plan_id | UUID Required for get_plan and optional for publish_video. | Schema enforced |
| get_publish | post_id | Non-empty string Identifies the durable post record. | Schema enforced |
| get_performance | window | 7d or 30d; defaults to 7d The window changes account reads only. | Schema enforced |
| get_performance | scope | Exactly one of post_id or account_id Supplying both or neither throws before a performance read. | Runtime enforced |
| get_best_posts | account_id | Connected account in the current workspace Unknown or cross-workspace accounts return account_not_found. | Runtime enforced |
| get_best_posts | metric | One normalized Postdom metric Null values are excluded with a reason and never ranked as zero. | Schema enforced |
| get_best_posts | window | 7d or 30d; defaults to 7d The rolling publication window ends at the read observation time. | Schema enforced |
| submit_plan | ends_at | Later than starts_at The API rejects a plan whose window does not move forward. | Runtime enforced |
| submit_plan | plan window | At most 14 days Measured from starts_at to ends_at. | Runtime enforced |
| submit_plan | targets | Unique account/platform pairs Duplicate plan targets are rejected. | Runtime enforced |
| publish_video | media host | HTTPS host; no credentials or port Without the production media resolver, localhost and private or special literal IPs are rejected. | Runtime enforced |
| publish_video | production media source URL | Configured source host; no query or fragment Enforced when production media storage is active, before internal delivery-host resolution. | Conditional runtime |
| publish_video | media response | HTTP 200 or 206 Postdom performs a byte-range reachability read before review. | Runtime enforced |
| publish_video | Content-Type | video/* or application/octet-stream for a video Applies to video sources; image handles from create_slideshow or upload_media are checked against each destination's image rules instead. A present incompatible type is rejected. For a media_handle the declared type is checked against each destination, so a QuickTime handle is refused by a destination accepting only video/mp4. For a media_url a missing type, or application/octet-stream, is unknown and passes: nothing declared it, so no destination rule can be tested against it. | Runtime enforced |
| publish_video | media size | At most 524 MB Checked whenever the size is known, whether or not production media storage is active. A media_handle always has one, because it was declared and signed for at upload. A media_url whose origin returns no length is published unchecked against this cap. | Runtime enforced |
| publish_video | per-destination delivery | The size and format limits recorded for each targeted destination Checked against the destinations a post targets, not the platforms declared at upload. A recorded limit may come from the platform or from the route Postdom delivers through, so a refusal names the destination that cannot receive the video without claiming whose limit stopped it. The whole post is refused; publish the rest in a separate request. | Runtime enforced |

Non-blocking records

## Warnings and guidance

Warnings inform human review. Unvalidated guidance records a platform expectation without claiming runtime rejection.

| Surface | Field | Limit | Enforcement |
| --- | --- | --- | --- |
| Instagram Reels | caption | 2,200 characters Preflight marks attention above this value; the request schema does not reject it. | Warning only |
| global | video duration | At most 10 minutes Recorded metadata; current request and media validation do not enforce duration. | Unvalidated guidance |
| global | media format | MP4 or QuickTime Recorded metadata; a generic video/* response can currently pass reachability. | Unvalidated guidance |
| TikTok | video duration | 3 seconds–10 minutes Recorded guidance, not current runtime validation. | Unvalidated guidance |
| Instagram Reels | video duration | At most 90 seconds Recorded guidance, not current runtime validation. | Unvalidated guidance |
| YouTube Shorts | video duration | At most 3 minutes Recorded guidance, not current runtime validation. | Unvalidated guidance |
| YouTube Shorts | aspect ratio | 9:16 Recorded guidance, not current runtime validation. | Unvalidated guidance |

Caller behavior

## Validation boundary

### Respect the strictest layer

Passing the callable schema does not guarantee media acceptance. Treat warnings and recorded guidance as human review evidence.

 VERIFIED · 26 AUGUST 2026  **Configured schemas · Runtime validators · Recorded platform limits**

Rules reflect the current configured path and may change with executable validation.
