> ## Documentation Index
> Fetch the complete documentation index at: https://docs.adside.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Instagram-posts publish

> Publish an image post, carousel, Reel or Story to this workspace's Instagram account, publicly. Files come from the asset library (asset_id) or a public HTTPS link; Adside converts them to what Instagram takes, then Instagram processes them, and this call WAITS (up to wait_seconds, default 3 minutes) for the post to go live. Images usually come back published in one call, with the permalink; videos may come back processing. If the answer says processing, call `adside meta instagram-publications get` (it waits too) until it changes. Never end the task on an unfinished publish, and never call this again for the same post: a second call is a second public post. An unknown outcome means the post may be live: tell the person to check the profile, and publish again only if they ask, with allow_duplicate. If you wrote or changed any of it (a caption you drafted, hashtags you added, a translation, a file you picked or generated that the person didn't name), first show the exact post (with render_ui when you have it) and ask: the account, the format, every file in order with its alt text and tags, the cover, the full caption, collaborators, location, the AI label, that the post is public, and that the caption can't be edited after posting. A clear request for a post the person wrote or saw publishes right away; an ambiguous one gets one question first.

CLI: `adside meta instagram-posts publish`



## OpenAPI

````yaml /api-reference/openapi.yaml post /v1/workspaces/{workspaceId}/meta/instagram-posts/publish
openapi: 3.1.0
info:
  title: Adside API
  version: 1.0.0
  description: >-
    Campaigns, creatives, assets and reporting across your ad accounts. Call it
    with a personal API key as a bearer token, or with the `adside` CLI: each
    page names its command.
servers:
  - url: https://api.adside.ai
    description: Production
security:
  - userAccess: []
tags:
  - name: Account
  - name: Reporting
  - name: Meta
  - name: Google Ads
  - name: LinkedIn
  - name: TikTok
  - name: Reddit
  - name: Snapchat
  - name: X
  - name: Google Tag Manager
  - name: Creatives
  - name: Creative styles
  - name: Media
  - name: Characters
  - name: Assets
  - name: Brands
  - name: Brain
  - name: Research
  - name: Boards
  - name: Artifacts
  - name: Audiences
  - name: Ad comments
  - name: Publications
  - name: Routines
  - name: Skills
  - name: To-dos
  - name: Audit
  - name: Credits
paths:
  /v1/workspaces/{workspaceId}/meta/instagram-posts/publish:
    post:
      tags:
        - Meta
      summary: Instagram-posts publish
      description: >-
        Publish an image post, carousel, Reel or Story to this workspace's
        Instagram account, publicly. Files come from the asset library
        (asset_id) or a public HTTPS link; Adside converts them to what
        Instagram takes, then Instagram processes them, and this call WAITS (up
        to wait_seconds, default 3 minutes) for the post to go live. Images
        usually come back published in one call, with the permalink; videos may
        come back processing. If the answer says processing, call `adside meta
        instagram-publications get` (it waits too) until it changes. Never end
        the task on an unfinished publish, and never call this again for the
        same post: a second call is a second public post. An unknown outcome
        means the post may be live: tell the person to check the profile, and
        publish again only if they ask, with allow_duplicate. If you wrote or
        changed any of it (a caption you drafted, hashtags you added, a
        translation, a file you picked or generated that the person didn't
        name), first show the exact post (with render_ui when you have it) and
        ask: the account, the format, every file in order with its alt text and
        tags, the cover, the full caption, collaborators, location, the AI
        label, that the post is public, and that the caption can't be edited
        after posting. A clear request for a post the person wrote or saw
        publishes right away; an ambiguous one gets one question first.


        CLI: `adside meta instagram-posts publish`
      operationId: meta.publish_instagram_post
      parameters:
        - name: workspaceId
          in: path
          required: true
          schema:
            type: string
            minLength: 1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $schema: https://json-schema.org/draft/2020-12/schema
              type: object
              properties:
                format:
                  type: string
                  enum:
                    - image
                    - carousel
                    - reel
                    - story
                  description: >-
                    image: one image in the feed. carousel: 2 to 20 images and
                    videos in one post. reel: one video. story: one image or
                    video for 24 hours.
                media:
                  minItems: 1
                  maxItems: 20
                  type: array
                  items:
                    type: object
                    properties:
                      asset_id:
                        description: >-
                          An Asset in this workspace's asset library. Prefer
                          this.
                        type: string
                        minLength: 1
                      url:
                        description: >-
                          A public HTTPS link to the file, as an alternative to
                          asset_id. Adside copies it into the asset library
                          first.
                        type: string
                        format: uri
                      alt_text:
                        description: Alt text, on image posts and carousel images.
                        type: string
                        maxLength: 1000
                      user_tags:
                        description: >-
                          Accounts tagged on this image, each with x and y.
                          Image posts and carousel images only.
                        maxItems: 20
                        type: array
                        items:
                          type: object
                          properties:
                            username:
                              type: string
                              pattern: ^@?[A-Za-z0-9._]{1,30}$
                              description: An Instagram username, with or without @
                            x:
                              description: >-
                                Where the tag sits, 0 (left) to 1 (right).
                                Required on image posts and carousel images; not
                                taken on Reels.
                              type: number
                              minimum: 0
                              maximum: 1
                            'y':
                              description: >-
                                Where the tag sits, 0 (top) to 1 (bottom).
                                Required on image posts and carousel images; not
                                taken on Reels.
                              type: number
                              minimum: 0
                              maximum: 1
                          required:
                            - username
                          additionalProperties: false
                    additionalProperties: false
                    description: 'One file: exactly one of asset_id or url.'
                  description: >-
                    The files, in the order they appear. One for image, reel and
                    story; 2 to 20 for carousel. Images that aren't a JPEG are
                    converted, and videos are converted to Instagram's MP4 when
                    needed; feed and carousel images must already be 4:5 to
                    1.91:1 (nothing is cropped).
                text:
                  description: >-
                    The caption, exactly as it will appear: up to 2200
                    characters, 30 hashtags and 20 mentions. It can't be edited
                    after posting. Not on Stories.
                  type: string
                  maxLength: 2200
                collaborators:
                  description: >-
                    Up to 3 public professional accounts invited as
                    collaborators. Not on Stories.
                  maxItems: 3
                  type: array
                  items:
                    type: string
                    pattern: ^@?[A-Za-z0-9._]{1,30}$
                    description: An Instagram username, with or without @
                location_id:
                  description: >-
                    The id of a Facebook Page that has a location. Not on
                    Stories.
                  type: string
                  pattern: ^\d+$
                user_tags:
                  description: >-
                    Accounts tagged on a Reel (username only) or a Story. On
                    image posts and carousels, tag each image in
                    media[].user_tags instead.
                  maxItems: 20
                  type: array
                  items:
                    type: object
                    properties:
                      username:
                        type: string
                        pattern: ^@?[A-Za-z0-9._]{1,30}$
                        description: An Instagram username, with or without @
                      x:
                        description: >-
                          Where the tag sits, 0 (left) to 1 (right). Required on
                          image posts and carousel images; not taken on Reels.
                        type: number
                        minimum: 0
                        maximum: 1
                      'y':
                        description: >-
                          Where the tag sits, 0 (top) to 1 (bottom). Required on
                          image posts and carousel images; not taken on Reels.
                        type: number
                        minimum: 0
                        maximum: 1
                    required:
                      - username
                    additionalProperties: false
                share_to_feed:
                  description: >-
                    Reels only: false keeps the Reel to the Reels tab. Instagram
                    shows it on the Feed too by default.
                  type: boolean
                cover:
                  description: 'Reels only: a cover image. Exactly one of asset_id or url.'
                  type: object
                  properties:
                    asset_id:
                      description: An Asset in this workspace's asset library. Prefer this.
                      type: string
                      minLength: 1
                    url:
                      description: >-
                        A public HTTPS link to the file, as an alternative to
                        asset_id. Adside copies it into the asset library first.
                      type: string
                      format: uri
                  additionalProperties: false
                cover_time_ms:
                  description: >-
                    Reels only: the frame to use as the cover, in milliseconds
                    from the start. Not with cover.
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                audio_name:
                  description: 'Reels only: the name the Reel''s original audio gets.'
                  type: string
                  minLength: 1
                trial:
                  description: 'Reels only: a trial Reel, shown to non-followers first.'
                  type: object
                  properties:
                    graduation:
                      type: string
                      enum:
                        - manual
                        - performance
                      description: >-
                        manual: the account decides in the Instagram app whether
                        to share it with followers. performance: Instagram
                        shares it if it does well.
                  required:
                    - graduation
                  additionalProperties: false
                instagram_account_id:
                  description: >-
                    Omit it: the post goes to this workspace's Instagram
                    account, and any other account is refused.
                  type: string
                  pattern: ^\d+$
                ai_generated:
                  description: >-
                    Meta's AI label. Omit it: it is on when any file was
                    generated or derived from a generated Asset.
                  type: boolean
                allow_duplicate:
                  default: false
                  description: >-
                    By default, the same post to the same account within 24
                    hours returns that publication instead of posting again. Set
                    true only when the person wants a second post, or after
                    checking the profile following an unknown outcome.
                  type: boolean
                wait_seconds:
                  default: 180
                  description: >-
                    Seconds to wait for the post to go live (or fail) before
                    answering. Default 180, max 240. Leave the default: one call
                    usually returns the live post. 0 answers at once.
                  type: integer
                  minimum: 0
                  maximum: 240
                confirmationToken:
                  type: string
              required:
                - format
                - media
              additionalProperties: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $schema: https://json-schema.org/draft/2020-12/schema
      security:
        - userAccess: []
components:
  securitySchemes:
    userAccess:
      type: http
      scheme: bearer
      description: >-
        A personal API key (`adside_pat_…`) or a token from `adside login`.
        Either carries the permissions of the person it belongs to.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.