Create Instagram post
Input
caption optionalPost caption; empty for none. Max 2200 chars.
Default: ""image_url optionalDirect URL of a single image to post (jpeg/png/gif/webp). Fetched by the browser itself, so it works on devices with no outbound network of their own. No size ceiling and no device requirement. Equivalent to passing a 1-item image_urls.
image_path optionalPath to a single local image file, attached straight from disk by the browser's own low-level file-attach mechanism — no encoding, no size ceiling. Resolved on the machine running the browser, and only works on a device whose browser permits attaching local files directly. An extension-paired browser does not: it refuses with "Not allowed", and nothing gets around that. Absolute paths only. Equivalent to a 1-item images_path.
image_urls optional1-10 direct image URLs, in order. A single URL publishes a normal post; 2 or more publish a carousel. Each is fetched by the browser itself, so this works on devices with no outbound network of their own. No size ceiling and no device requirement — the general answer, and the only practical route for a carousel of real photos.
images_path optional1-10 paths to local images, in order, attached straight from disk by the browser's own low-level file-attach mechanism — no encoding, no size ceiling. Resolved on the machine running the browser, and only works on a device whose browser permits attaching local files directly. An extension-paired browser does not. Absolute paths only. Takes precedence over image_urls.
image_base64 optionalA single image's bytes as base64 (a bare payload or a full data: URL), decoded in-page — needs no network and no local file access, so it is the only local-file route on an extension-paired device. Capped at ~96KB of base64, i.e. about a 72KB file: the MCP endpoint answers `Payload Too Large` above that. Line-wrapped output, base64url and missing padding are all accepted. Equivalent to a 1-item images_base64.
images_base64 optional1-10 images as base64 (bare payloads or full data: URLs), in order, decoded in-page — needs no network and no local file access. Capped across all images combined at ~96KB of base64 total. Real photos will not fit for more than one — use image_urls for a real carousel. Takes precedence over images_path and image_urls.
Output
url requiredPermalink of the new post.
code requiredShortcode of the new post.
caption_applied requiredTrue when a caption was requested and Instagram recorded it; false when one was requested but the published post carries none. Always true when no caption was requested.
pk optionalMedia pk.
caption optionalThe caption Instagram actually recorded on the published post (read back from configure/configure_sidecar), NOT an echo of the input. Empty when none was requested or none landed.
image_bytes optionalTotal size in bytes of the image(s) injected into the composer. null when attached via a *_path field, where the browser opens the file(s) itself and the bytes never cross the driver boundary.
carousel_count optionalcarousel_media_count as Instagram reported it on configure_sidecar — the authoritative count of slides actually published. null for a single-image post, which uses a different endpoint that has no such field.
