Posts
Upload videos to YouTube through the shared posts API.
Publish to a YouTube channel through POST /v1/posts with mediaKind: "video".
Cross-platform flow: Media guide.
Supported formats
mediaKind | Supported | Notes |
|---|---|---|
video | Yes | Exactly one mediaUrls entry |
text / image / multi-image / stories | No | UNSUPPORTED_MEDIA_KIND |
Features
| Feature | Supported | Notes |
|---|---|---|
| Thread / quote | No | |
| Schedule | Yes | scheduledFor + timezone |
| Visibility | Yes | Destination privacyStatus: public | unlisted | private |
| Remote delete | Yes | DELETE …/destinations/:id |
| Title | Yes | Post text (max 100 chars) → YouTube title |
| Description | Yes | Destination description → YouTube description |
Title and description
| Field | Maps to |
|---|---|
text (or destinations[].text) | YouTube title (truncated to 100 chars) |
destinations[].description | YouTube description (max 5000) |
If description is omitted, Onepostly falls back to using text as the description (legacy behavior).
description is YouTube-only. Sending it on a non-YouTube destination returns 400 with VALIDATION_ERROR.
Formatting
Both title and description are plain text. Onepostly does not parse Markdown or HTML.
| Input | Behavior |
|---|---|
| Spaces | Preserved as sent |
Newlines (\n in JSON) | Preserved in the description (line breaks on YouTube) |
Bold / Markdown / HTML (**bold**, <b>, etc.) | Not rendered — sent as literal characters |
In JSON, use a real newline escape ("Line one\nLine two"). A double-escaped \\n is stored as the two characters \ and n, not a line break.
Visibility
Set destinations[].privacyStatus when creating the post. Omitted values default to public.
| Value | YouTube behavior |
|---|---|
public | Listed and searchable (default) |
unlisted | Anyone with the link; not listed in channel / search |
private | Only the channel owner (and accounts you share with) |
privacyStatus is YouTube-only. Sending it on a non-YouTube destination returns 400 with VALIDATION_ERROR.
Unverified Google OAuth clients may still force uploads to private (locked) until app verification — even when you request public or unlisted.
Create
curl -X POST https://api.onepostly.com/v1/posts \
-H "x-api-key: op_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Launch walkthrough #Shorts",
"mediaKind": "video",
"mediaUrls": ["https://cdn.example.com/clip.mp4"],
"destinations": [
{
"connectionId": "YOUR_YOUTUBE_CONNECTION_ID",
"privacyStatus": "unlisted",
"description": "Full video description. Timestamps, links, and credits go here."
}
]
}'Response: 202 with status: "queued". When published, externalPostId is the YouTube video id and externalUrl is https://www.youtube.com/watch?v=….
Shorts
Use a vertical 9:16 video under ~60 seconds. Including #Shorts in the title helps Shorts shelf classification (YouTube-side heuristic).
Limits
| Limit | Value |
|---|---|
| Onepostly publish cap | 256 MB |
| Quota per upload | 1,600 units |
Remote delete
curl -X DELETE "https://api.onepostly.com/v1/posts/POST_ID/destinations/DEST_ID" \
-H "x-api-key: op_YOUR_KEY"