콘텐츠 게시 API를 사용하여 Instagram 프로페셔널 계정에 단일 이미지, 동영상, 릴스(즉, 단일 미디어 게시물)를 게시하거나, 여러 이미지와 동영상을 포함하는 게시물(슬라이드 게시물)을 게시할 수 있습니다.
2023년 7월 1일부터 Instagram 콘텐츠 게시 API를 통해 게시된 모든 단일 피드 동영상은 릴스로 공유됩니다.
모든 요청에는 앱 사용자의 사용자 액세스 토큰을 포함해야 합니다.
게시는 다음과 같은 권한을 조합해서 사용합니다. 정확한 조합은 앱에서 사용하는 엔드포인트에 따라 다릅니다. 각 엔드포인트에 어떤 권한이 필요한지 확인하려면 엔드포인트 참고 자료를 참조하세요.
앱에서 또는 앱을 요청한 비즈니스에서 역할이 부여되지 않은 앱 사용자가 앱을 사용할 경우 앱 검수를 통해 각 권한에 대한 승인을 요청해야 역할이 없는 앱 사용자가 앱에 권한을 부여할 수 있습니다.
Facebook에서는 게시 시도 시 사용한 미디어에 대해 cURL을 실행하여 해당 시도 시점에 미디어를 공개적으로 액세스 가능한 서버에서 호스팅되도록 합니다.
페이지 게시 인증(PPA)이 필요한 페이지에 연결된 Instagram 프로페셔널 계정에는 PPA를 완료할 때까지 게시할 수 없습니다.
앱 사용자는 처음에 PPA가 필요하지 않지만 나중에 필요한 페이지에서 작업을 수행할 수 있습니다. 이 시나리오에서는 PPA를 완료할 때까지 앱 사용자가 Instagram 프로페셔널 계정에 콘텐츠를 게시할 수 없습니다. 앱 사용자의 페이지에 PPA가 필요한지 확인할 수 있는 방법이 없으므로, 앱 사용자에게 미리 PPA를 완료하도록 안내하는 것이 좋습니다.
추가적인 제한 사항은 각 엔드포인트 참고 자료를 참조하세요.
Instagram 계정은 연속 24시간 동안 API를 통해 게시물을 최대 50개까지 게시할 수 있습니다. 슬라이드는 단일 게시물로 간주됩니다. 이 제한은 미디어 컨테이너를 게시하려고 할 때 POST /{ig-user-id}/media_publish
엔드포인트에 적용됩니다. 앱에서도 게시 사용 제한을 적용하는 것이 좋습니다. 특히 앱에서 앱 사용자가 게시물이 나중에 게시되도록 예약할 수 있는 경우에 권장합니다.
Instagram 프로페셔널 계정의 현재 사용 제한 사용량을 확인하려면 GET /{ig-user-id}/content_publishing_limit
엔드포인트를 쿼리하세요.
API는 다음과 같은 엔드포인트로 구성됩니다. 사용 요구 사항은 각 엔드포인트의 참고 자료를 참조하세요.
POST /{ig-user-id}/media
— 미디어를 업로드하고 미디어 컨테이너를 만듭니다.POST /{ig-user-id}/media_publish
— 미디어 컨테이너를 사용하여 업로드된 미디어를 게시합니다.GET /{ig-container-id}?fields=status_code
— 미디어 컨테이너 게시 자격 요건과 상태를 확인합니다.GET /{ig-user-id}/content_publishing_limit
— 앱 사용자의 현재 게시 사용 제한 사용량을 확인합니다.단일 이미지, 동영상, 스토리 또는 릴스를 게시하는 절차는 2단계로 구성됩니다.
POST /{ig-user-id}/media
엔드포인트를 사용하여 공개 서버에서 호스팅되는 이미지 또는 동영상에서 컨테이너를 만듭니다.POST /{ig-user-id}/media_publish
엔드포인트를 사용하여 컨테이너를 게시합니다.1/2단계: 컨테이너 만들기
다음과 같은 주소의 이미지가 있다고 가정합니다.
https://www.example.com/images/bronz-fonz.jpg
'#BronzFonz' 해시태그를 캡션으로 넣어서 게시하려고 합니다. POST /{ig-user-id}/media
엔드포인트로 요청을 보냅니다.
POST https://graph.facebook.com/v21.0
/17841400008460056/media
?image_url=https://www.example.com/images/bronz-fonz.jpg
&caption=#BronzFonz
그러면 이미지의 컨테이너 ID가 반환됩니다.
{ "id": "17889455560051444" // IG Container ID }
2/2단계: 컨테이너 게시
POST /{ig-user-id}/media_publish
엔드포인트를 사용하여 이전 단계에서 반환된 컨테이너 ID를 게시합니다.
POST https://graph.facebook.com/v21.0
/17841400008460056/media_publish ?creation_id=17889455560051444
{ "id": "17920238422030506" // IG Media ID }
단일 게시물(슬라이드 게시물)에 이미지, 동영상 또는 그 두 가지의 조합을 최대 10개까지 게시할 수 있습니다. 슬라이드 게시는 3단계 절차로 구성됩니다.
POST /{ig-user-id}/media
엔드포인트를 사용하여 슬라이드에 표시할 각 이미지와 동영상에 대해 개별적인 항목 컨테이너를 만듭니다.POST /{ig-user-id}/media
엔드포인트를 사용하여 항목에 대해 단일 슬라이드 컨테이너를 만듭니다.POST /{ig-user-id}/media_publish
엔드포인트를 사용하여 슬라이드 컨테이너를 게시합니다.슬라이드 게시물은 계정의 사용 제한에서 단일 게시물로 간주됩니다.
제한 사항
1/3단계: 항목 컨테이너 만들기
POST /{ig-user-id}/media
엔드포인트를 사용하여 슬라이드에 표시할 이미지나 동영상에 대한 항목 컨테이너를 만듭니다. 슬라이드에는 이미지, 동영상 또는 그 두 가지의 조합을 모두 합쳐 최대 10개까지 포함할 수 있습니다.
POST /{ig-user-id}/media
다음 매개변수는 필수입니다. 지원되는 매개변수를 더 보려면 POST /{ig-user-id}/media
엔드포인트 참고 자료를 참조하세요.
is_carousel_item
— true
로 설정합니다. 슬라이드에 표시할 이미지 또는 동영상을 나타냅니다.image_url
— (이미지 전용) 이미지에 대한 경로입니다. 전달된 URL을 사용하여 이미지에 cURL을 실행하므로 이미지가 공용 서버에 있어야 합니다.media_type
— (동영상 전용) VIDEO
로 설정합니다. 미디어가 동영상임을 나타냅니다.video_url
— (동영상 전용) 동영상에 대한 경로입니다. 전달된 URL을 사용하여 동영상에 cURL을 실행하므로 동영상이 공용 서버에 있어야 합니다.작업이 성공할 경우 API는 슬라이드 컨테이너를 만들 때 사용할 수 있는 항목 컨테이너 ID를 반환합니다.
슬라이드에 표시할 각 이미지 또는 동영상에 대해 이 절차를 반복합니다.
curl -i -X POST \
"https://graph.facebook.com/v21.0
/90010177253934/media?image_url=https%3A%2F%2Fsol...&is_carousel_item=true&access_token=EAAOc..."
{ "id": "17899506308402767" }
2/3단계: 슬라이드 컨테이너 만들기
POST /{ig-user-id}/media
엔드포인트를 사용하여 슬라이드 컨테이너를 만듭니다.
POST /{ig-user-id}/media
다음 매개변수는 필수입니다. 지원되는 매개변수를 더 보려면 POST /{ig-user-id}/media
엔드포인트 참고 자료를 참조하세요.
media_type
— CAROUSEL
로 설정합니다. 컨테이너의 용도가 슬라이드임을 나타냅니다.children
— 게시된 슬라이드에 표시해야 하는 각 이미지와 동영상의 컨테이너 ID(최대 10개)로 구성된 배열입니다. 슬라이드에는 이미지, 동영상 또는 그 두 가지의 조합을 모두 합쳐 최대 10개까지 포함할 수 있습니다.
curl -i -X POST \
"https://graph.facebook.com/v21.0
/90010177253934/media?caption=Fruit%20candies&media_type=CAROUSEL&children=17899506308402767%2C18193870522147812%2C17853844403701904&access_token=EAAOc..."
{ "id": "18000748627392977" }
3/3단계: 슬라이드 컨테이너 게시
POST /{ig-user-id}/media_publish
엔드포인트를 사용하여 슬라이드 컨테이너(슬라이드 게시물)를 게시합니다. 계정은 24시간 이내에 게시물을 최대 50개까지 게시할 수 있습니다. 슬라이드를 게시할 경우 이는 단일 게시물로 간주됩니다.
POST /{ig-user-id}/media_publish
다음 매개변수는 필수입니다.
creation_id
— 슬라이드 컨테이너 ID입니다.작업이 성공하면 API는 슬라이드 사진첩 IG 미디어 ID를 반환합니다.
curl -i -X POST \
"https://graph.facebook.com/v21.0
/90010177253934/media_publish?creation_id=18000748627392977&access_token=EAAOc..."
{ "id": "90010778390276" }
릴스는 특정 사양을 충족하고 Facebook 알고리즘에서 선택되는 경우 Instagram 앱의 릴스 탭에 표시할 수 있는 짧은 동영상입니다. 릴스를 게시하려면 단일 미디어 게시물을 게시하는 단계를 따르고 media_type=REELS
매개변수를 따르고 video_url
매개변수를 사용하는 동영상 경로를 포함하세요.
릴스를 게시할 때 media_type=REELS
를 설정하더라도 이는 새로운 미디어 유형에 해당하지 않습니다. 릴스를 게시하고 해당 media_type
필드를 요청하는 경우 이 값은 VIDEO
로 반환됩니다. 게시된 동영상이 릴스로 지정되었는지 확인하려면 대신 media_product_type
필드를 요청하세요.
GitHub 코드 샘플(insta_reels_publishing_api_sample)을 사용하여 Instagram에 릴스를 게시하는 방법을 알아볼 수 있습니다.
개발자들에게 더 많은 편의를 제공하기 위해 Meta에서는 Postman API 플랫폼에 Instagram 릴스에 대한 그래프 API 호출 세트 전체를 공개했습니다. 자세한 내용은 Facebook 릴스 및 Instagram 릴스용 Postman 컬렉션을 참조하세요.
릴스에 대한 자세한 내용은 릴스 개발자 문서를 참조하세요.
지금은 비즈니스 계정만 콘텐츠 게시 API를 사용하여 스토리를 게시할 수 있습니다.
스토리는 Instagram에 IG 스토리로 게시되는 동영상과 이미지입니다. 스토리를 게시하려면 단일 미디어 게시물을 게시하는 것과 동일한 단계를 따르고 media_type=STORIES
매개변수와 image_url
또는 video_url
매개변수를 사용하는 이미지/동영상 경로를 포함하세요.
참고: 스토리를 게시할 때 media_type=STORIES
를 설정하더라도 이는 새로운 미디어 유형에 해당하지 않습니다. 스토리를 게시하고 해당 media_type
필드를 요청하는 경우 이 값은 IMAGE/VIDEO
로 반환됩니다. 게시된 이미지/동영상이 스토리로 지정되었는지 확인하려면 대신 media_product_type
필드를 요청하세요.
재개 가능한 업로드 프로토콜은 릴스, 동영상 스토리, 동영상 슬라이드 항목 media_types
에 대한 동영상 업로드를 지원하는 Instagram 콘텐츠 게시를 위한 새로운 플로입니다.
이 새로운 프로토콜은 로컬 동영상 및 공개 호스팅 URL 동영상에서 Instagram 미디어를 만드는 작업을 지원합니다. 이 프로토콜을 사용하면 네트워크가 중단되거나 다른 전송 장애가 일어난 후에 로컬 파일 업로드 작업을 재개할 수 있어 네트워크 장애 발생 시 시간과 대역폭을 절약할 수 있습니다. 이 프로토콜에서는 미디어 사양이 유지됩니다.
POST https://graph.facebook.com/{api-version}/{ig-user-id}/media
— upload_type=resumable을 설정하여 동영상 생성 컨테이너를 초기화합니다.POST https://rupload.facebook.com/ig-api-upload/{api-version}/{ig-container-id}
— 재개 가능한 업로드 프로토콜을 사용하여 로컬 동영상 파일이나 호스팅 URL에서 더욱 안정적으로 동영상을 업로드합니다. POST https://graph.facebook.com/{api-version}/{ig-user-id}/media_publish
— 미디어 컨테이너를 사용하여 업로드한 미디어를 게시합니다.GET /{ig-container-id}?fields=status_code
— 미디어 컨테이너 게시 자격 요건 및 상태를 확인합니다.user_tags=[{username:’ig_user_name’}]
을 user_tags=%5B%7Busername:ig_user_name%7D%5D
로 인코딩합니다. 여기서 [
는 %5B
로 인코딩하고 {
는 %7B
로 인코딩합니다. 더 많은 변환을 보려면 HTML URL 인코딩 표준을 참조하세요.curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media" \ -d "media_type=REELS" \ -d "upload_type=resumable" \ -d "caption={caption}"\ -d "collaborators={collaborators-username}" -d "cover_url={cover-url}" \ -d "audio_name={audio-name}" \ -d "user_tags={user-tags}" \ -d "location_id={location-id}" \ -d "thumb_offset={thumb-offset}" \ -H "Authorization: OAuth {access-token}"
curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media" \ -d "media_type=STORIES" \ -d "upload_type=resumable" \ -H "Authorization: OAuth {access-token}"
curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media" \ -d "media_type=VIDEO" \ -d "is_carousel_item=true" \ -d "upload_type=resumable" \ -H "Authorization: OAuth {access-token}"
{ "id": "{ig-container-id}", "uri": "https://rupload.facebook.com/ig-api-upload/{api-version}/{ig-container-id}" }
대부분 그래프 API 호출은 graph.facebook.com
호스트를 사용하지만 릴스용 동영상 업로드 호출은 rupload.facebook.com
을 사용합니다.
업로드된 동영상 파일에 지원되는 파일 소스는 다음과 같습니다.
재개 가능한 업로드 세션 호출에서 반환된 ig-container-id
를 사용하여 동영상을 업로드합니다.
rupload.facebook.com
이어야 합니다.media_type
은 동영상을 업로드하는 데 동일한 플로를 공유합니다.ig-container-id
는 재개 가능한 업로드 세션 호출에서 반환된 ID입니다. access-token
은 이전의 단계에서 사용했던 것과 동일합니다.offset
은 업로드되는 첫 바이트로 설정되며, 일반적으로 0
입니다.file_size
는 파일 크기(바이트)로 설정됩니다.Your_file_local_path
는 로컬 파일의 파일 경로로 설정됩니다. 예를 들어 macOS의 Downloads 폴더에서 파일을 업로드하는 경우 경로는 @Downloads/example.mov입니다.curl -X POST "https://rupload.facebook.com/ig-api-upload/{api-version}/{ig-container-id}" \ -H "Authorization: OAuth {access-token}" \ -H "offset: 0" \ -H "file_size: Your_file_size_in_bytes" \ --data-binary "@my_video_file.mp4"
curl -X POST "https://rupload.facebook.com/ig-api-upload/{api-version}/{ig-container-id}" \ -H "Authorization: OAuth {access-token}" \ -H "file_url: https://example_hosted_video.com"
// Success Response Message { "success":true, "message":"Upload successful." } // Failure Response Message { "debug_info":{ "retriable":false, "type":"ProcessingFailedError", "message":"{\"success\":false,\"error\":{\"message\":\"unauthorized user request\"}}" } }
1단계와 2단계를 다시 사용하여 여러 ig-container-ids
를 생성할 수 있습니다. 이때 is_carousel_item
매개변수는 true
로 설정합니다. 그런 다음, 모든 슬라이드 항목을 포함하는 슬라이드 컨테이너를 생성합니다. 슬라이드 항목은 이미지 및 동영상과 혼합될 수 있습니다.
curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media" \ -d "media_type=CAROUSEL" \ -d "caption={caption}"\ -d "collaborators={collaborator-usernames}" \ -d "location_id={location-id}" \ -d "product_tags={product-tags}" \ -d "children=[{ig-container-id},{ig-container-id}...]" \ -H "Authorization: OAuth {access-token}"
릴스 및 동영상 스토리의 경우, 1단계에서 생성한 {ig-container-id}
를 사용하여 동영상을 게시합니다. 슬라이드 컨테이너의 경우, 3단계에서 생성한 {ig-container-id}
를 사용하여 슬라이드 컨테이너를 게시합니다.
curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media_publish" \ -d "creation_id={ig-container-id}" \ -H "Authorization: OAuth {access-token}"
graph.facebook.com
은 업로드 상태를 읽기 위한 GET
엔드포인트를 제공합니다. video_status
필드에는 로컬 업로드 프로세스에 대한 상세 정보가 포함됩니다.
uploading_phase
는 파일이 성공적으로 업로드되었는지 여부와 전송된 용량(바이트)을 알려줍니다. processing_phase
에는 동영상 파일이 업로드된 후 동영상 처리 상태에 대한 상세 정보가 포함됩니다.// GET status from graph.facebook.com curl -X GET "https://graph.facebook.com/v19.0/{ig-container-id}?fields=id,status,status_code,video_status" \ -H "Authorization: OAuth {access-token}"
graph.facebook.com
엔드포인트의 응답 샘플// A successfully created ig container { "id": "{ig-container-id}", "status": "Published: Media has been successfully published.", "status_code": "PUBLISHED", "video_status": { "uploading_phase": { "status": "complete", "bytes_transferred": 37006904 }, "processing_phase": { "status": "complete" } } } // An interrupted ig container creation, from here you can resume your upload in step 2 with offset=50002. { "id": "{ig-container-id}", "status": "Published: Media has been successfully published.", "status_code": "PUBLISHED", "video_status": { "uploading_phase": { "status": "in_progress", "bytes_transferred": 50002 }, "processing_phase": { "status": "not_started" } } }
이미지, 슬라이드, 릴스에서 공개된 Instagram 사용자를 공동 작업자로 추가할 수 있으며, 이 사용자는 해당 미디어의 공동 작업자가 되기 위한 초대장을 받게 됩니다. 이미지에서 사용자를 태그하려면 위의 단일 미디어 게시물 단계를 따릅니다. 하지만 미디어 컨테이너를 생성할 때는 공동 작업자 매개변수와 해당 미디어의 공동 작업자로 초대하고자 하는 사용자의 Instagram 사용자 이름을 나타내는 문자열의 배열을 포함하세요.
POST graph.facebook.com/17841400008460056/media ?image_url=https://www.example.com/images/bronzed-fonzes.jpg &caption=#BronzedFonzes! &collaborators= [‘username1’,’username2’]
검색 문자열과 일치하는 페이지를 검색하려면 페이지 검색 API 를 사용하여 쿼리에 'location' 필드를 포함하세요. 그런 다음, 결과를 파싱하여 물리적 위치에 생성된 페이지를 확인하세요. 이미지 또는 동영상을 게시할 때 페이지 ID를 포함하면 해당 페이지와 연결된 위치가 사진에 태그됩니다.
태깅에 사용할 수 있으려면 페이지에 위도와 경도 위치 데이터가 있어야 합니다.
사용하려는 페이지의 위도와 경도 데이터가 응답에 있는지 확인합니다. 위치 데이터가 없는 페이지를 사용하여 컨테이너를 만들려고 시도하면 코딩된 예외 INSTAGRAM_PLATFORM_API__INVALID_LOCATION_ID
와 함께 실패합니다.
페이지 ID가 생기면 단일 미디어 또는 슬라이드 항목 컨테이너를 게시할 때 location_id
매개변수에 할당합니다.
단일 미디어 게시물과 슬라이드 게시물을 Instagram Shopping 제품으로 태그할 수 있습니다. 자세한 방법은 제품 태깅 가이드를 참조하세요.
이미지에 전체 공개 Instagram 사용자를 태그하면 해당 사용자는 태그될 때 알림을 받게 됩니다.
이미지에서 사용자를 태그하려면 위의 단일 미디어 게시물 단계를 따릅니다. 하지만 미디어 컨테이너를 만들 때는 user_tags
매개변수, 이미지에서 Instagram 사용자를 나타내는 개체의 배열, 이미지 자체의 x/y 좌표를 포함합니다.
참고: 사용자 태그는 슬라이드의 동영상 미디어에서 지원되지 않습니다.
POST graph.facebook.com/17841400008460056/media ?image_url=https://www.example.com/images/bronzed-fonzes.jpg &caption=#BronzedFonzes! &user_tags= [ { username:'kevinhart4real', x: 0.5, y: 0.8 }, { username:'therock', x: 0.3, y: 0.2 } ]
컨테이너 ID가 반환되면 IG 사용자 미디어 게시 엔드포인트를 사용하여 게시합니다.
user_tags
값은 JSON 형식의 개체 배열이어야 합니다.username
, x
, y
)을 모두 포함해야 합니다.x
와 y
값은 이미지 상단 왼쪽에서 시작하는 float
숫자이면서 0.0
~1.0
범위여야 합니다.동영상의 컨테이너를 만들 수 있지만 POST /{ig-user-id}/media_publish
엔드포인트가 게시된 미디어 ID를 반환하지 않을 경우 GET /{ig-container-id}?fields=status_code
엔드포인트를 쿼리하여 컨테이너의 게시 상태를 가져올 수 있습니다. 이 엔드포인트는 다음 중 하나를 반환합니다.
EXPIRED
— 컨테이너가 24시간 이내에 게시되지 않아서 만료되었습니다.ERROR
— 컨테이너가 게시 프로세스를 완료하지 못했습니다.FINISHED
— 컨테이너와 해당 미디어 개체를 게시할 준비가 되었습니다.IN_PROGRESS
— 컨테이너가 아직 게시 절차 중에 있습니다.PUBLISHED
— 컨테이너 미디어 개체가 게시되었습니다.컨테이너 상태는 1분에 1회, 최대 5분 이내로 쿼리하는 것이 좋습니다.
오류 코드 참고 자료를 참조하세요.