Portal Community
Two-step publishing: Instagram requires creating a container first, then publishing it as a separate call. Connect media/createContainer to media/publish via {{ $output.instagram.creationId }}.

When to Use

Configuration

Connection

FieldRequiredDescription
accessTokenRequiredLong-lived Instagram access token stored in BizFirst Credentials Manager.
igUserIdRequiredYour Instagram Business/Creator account ID (numeric string).

Operation

FieldRequiredDescription
resourceRequiredMust be media.
operationRequiredMust be create-container.
mediaTypeRequiredIMAGE, VIDEO, REELS, or CAROUSEL.
imageUrlOptionalPublicly accessible HTTPS URL of the image (required for IMAGE type). Minimum 320px on shortest side.
videoUrlOptionalPublicly accessible HTTPS URL of the video (required for VIDEO/REELS). MOV or MP4 format.
captionOptionalPost caption text (up to 2200 characters). Hashtags and @mentions supported.
locationIdOptionalFacebook Place ID to tag a location on the post.
userTagsOptionalJSON array: [{"username":"handle","x":0.5,"y":0.3}]. Coordinates are 0.0–1.0 relative to image dimensions.
isCarouselItemOptionaltrue if this is a child of a CAROUSEL container. Default false.
Media URL accessibility: The imageUrl or videoUrl must be publicly accessible over HTTPS at container creation time. Instagram's servers fetch the media directly. Pre-signed URLs with short expiry, private CDN URLs, or localhost URLs will fail.

Sample Configuration JSON

{
  "resource": "media",
  "operation": "create-container",
  "accessToken": "{{ $credential.instagram.accessToken }}",
  "igUserId": "17841400000000000",
  "mediaType": "IMAGE",
  "imageUrl": "https://cdn.yourbrand.com/posts/summer-launch-2025.jpg",
  "caption": "Our summer collection is live! Shop the link in bio. #fashion #summer2025",
  "locationId": "213385402",
  "userTags": "[{\"username\":\"partner_brand\",\"x\":0.5,\"y\":0.3}]"
}

Validation Errors

ErrorCause
accessToken is requiredaccessToken field is missing or empty.
igUserId is requiredigUserId field is missing or empty.
Graph API error 100Invalid or inaccessible imageUrl / videoUrl.
Graph API error 2207026Caption exceeds 2200 character limit.

Output

Success Port

FieldTypeDescription
statusstring"success"
creationIdstringContainer ID. Pass to media/publish as creationId.
payloadstringRaw JSON response from the Graph API.

Error Port

FieldTypeDescription
statusstring"error"
errorCodestringGraph API error code.
errorMessagestringError description.
payloadstringRaw error response.

Sample Output JSON

{
  "status": "success",
  "creationId": "17889615814797510",
  "payload": "{\"id\":\"17889615814797510\"}"
}

Expression Reference

ExpressionValue
{{ $output.instagram.creationId }}Container ID for use in media/publish

Node Policies & GuardRails

Examples

Image post from workflow data

{
  "resource": "media",
  "operation": "create-container",
  "accessToken": "{{ $credential.instagram.accessToken }}",
  "igUserId": "{{ $env.IG_USER_ID }}",
  "mediaType": "IMAGE",
  "imageUrl": "{{ $output.cdnUpload.publicUrl }}",
  "caption": "{{ $input.postCaption }}",
  "locationId": "{{ $input.facebookPlaceId }}"
}

Reel container creation

{
  "resource": "media",
  "operation": "create-container",
  "accessToken": "{{ $credential.instagram.accessToken }}",
  "igUserId": "17841400000000000",
  "mediaType": "REELS",
  "videoUrl": "https://cdn.yourbrand.com/reels/product-demo-v2.mp4",
  "caption": "Watch how it works in 30 seconds! #productdemo #howto"
}

After success, pass {{ $output.instagram.creationId }} to media/publish.