API reference
Create a post
Publish now, or schedule with schedule_at, across every selected network.
POST
/api/v1/postsRequires a Bearer API key — see authentication.
Creates a post and fans it out to the connected networks you name. Omit schedule_at to publish immediately; include it to queue the post for later. Only networks you've connected are targeted — unknown or unconnected ids are dropped.
Body parameters
captionstringoptionalThe post text, adapted per network (for example, truncated to 280 characters on X). Defaults to an empty string, but a post with neither a caption nor media is rejected.
platformsarray<string>requiredNetwork ids to publish to:
tiktok, instagram, youtube, x, linkedin, facebook, threads, pinterest, reddit, bluesky, discord, telegram. Unknown ids are ignored; at least one must resolve to a connected account.schedule_atinteger | stringoptionalWhen to publish. Omit to publish now. Accepts a Unix timestamp in seconds or milliseconds, or an ISO 8601 string. Must be in the future (60 seconds of clock skew is tolerated).
mediastringoptionalA publicly reachable URL to an image or video. Required by networks that can't post text alone (Instagram, Pinterest, TikTok, YouTube). See the Media guide.
Request
Send the request to POST /api/v1/posts. Set your key in the environment as POSTMYISH_KEY to run these as-is.
curl -X POST https://postmyish.com/api/v1/posts \
-H "Authorization: Bearer $POSTMYISH_KEY" \
-H "Content-Type: application/json" \
-d '{
"caption": "We just shipped v2 🚀",
"platforms": ["x", "linkedin", "bluesky"]
}'Response
{
"id": "post_7d1a9c8b",
"caption": "We just shipped v2 🚀",
"platforms": ["x", "linkedin", "bluesky"],
"status": "published",
"has_media": false,
"scheduled_at": null,
"published_at": 1752566400000,
"reach": 0,
"engagement_rate": 0
}Response fields
idstringUnique identifier for the post.
captionstringThe caption text as stored.
platformsarray<string>The network ids this post targets.
statusstringOne of
draft, scheduled, publishing, or published.has_mediabooleanWhether media is attached to the post.
scheduled_atinteger | nullUnix milliseconds the post is scheduled to publish, or
null.published_atinteger | nullUnix milliseconds the post was published, or
null.reachintegerTotal reach reported back by the networks. Starts at 0 and only grows once a network reports.
engagement_ratenumberBlended engagement rate as a percentage, rounded to two decimals. Starts at 0.
Try it
Run this endpoint live with your own key. The key is kept in your browser (local storage) and sent straight to the API — nothing passes through the docs.
This runs against the live API and really publishes — use a test target.