September 7, 2026
Image and video posts, and the reason a media post is slower than the others
POST /api/reddit/submit now creates IMAGE, VIDEO and VIDEOGIF posts as well as text, link and poll, at the same $0.012 write rate and with no new endpoint. You pass image_url or video_url and we fetch the media, upload it to Reddit, and hold the request open until Reddit confirms the post.
/api/reddit/submit
- You give us a URL rather than bytes. It is the only shape that works for a large video, and you almost certainly already host the file. The URL must be publicly readable over https: we fetch it server-side through the same guard our outbound webhooks use, so anything behind a login, on a private network, or on plain http is refused with a message that says which of those it was. Redirects are re-checked at every hop rather than followed blindly, because a public host answering a redirect to a private address is the standard way past a check like this.
- A URL with no file extension is fine, and that is deliberate rather than incidental. Signed and CDN URLs usually have none, so the Content-Type your server sends decides the media type and the extension is only the fallback. An extension-only rule would have rejected a large share of real image URLs.
- url is NOT the field for media. Putting an image URL in url asks for a link post pointing at the image, which is a different post from an image post. That combination is refused rather than guessed at, for the same reason an unsupported kind is refused by name: you would have no way to know you got the other one, and it is published under your name.
- A video needs a poster image and video_poster_url is required. Reddit will not accept a video without one. PRAW uploads a stand-in image when the caller gives none; we do not, because an image we generated would be published as yours.
- WHY A MEDIA POST IS CONFIRMED RATHER THAN FIRE-AND-FORGET, since it is the part that shapes the contract: Reddit processes an upload asynchronously and its submit response carries NO post id at all, only a websocket. So the POST alone genuinely cannot tell you whether the post exists. We hold your request open until Reddit confirms and return the same post_id and permalink as every other kind. If processing is still running after three minutes you get MEDIA_CONFIRM_TIMEOUT, which says plainly that the post was NOT rejected and may still appear, and asks you to check the account's recent posts before submitting again rather than posting it twice.
- Size limits are Reddit's, not ours. We do not invent a smaller one, because a guessed limit refuses posts Reddit would have accepted. An oversized file comes back with the real numbers, for example 31.4 MB against a limit of 20.0 MB, parsed out of the XML Reddit's media host answers with instead of surfacing as an opaque failure.
- The same honesty as the rest of this endpoint: NO post of any kind has been created through it against a real Reddit account. Every request shape is derived from PRAW, which runs against real Reddit and is open source. The endpoint count is unchanged at 59, because these are new kinds on an existing route rather than new routes.
