{"openapi":"3.1.0","info":{"title":"Instagram Profile \u0026 Posts","version":"1.0.0","description":"![x402 Atlas](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIj48ZyBzdHJva2U9IiMxRTQwQUYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+PHBhdGggZD0iTTI0IDdWMjhNMjQgMjhMOCA0Mk0yNCAyOEw0MCA0MiIgc3Ryb2tlLXdpZHRoPSIyLjEiLz48cGF0aCBkPSJNMjQgN0w4IDQyTTI0IDdMNDAgNDJNMTUgMjhIMzMiIHN0cm9rZS13aWR0aD0iMi43Ii8+PC9nPjxnIGZpbGw9IiMxRTQwQUYiPjxjaXJjbGUgY3g9IjgiIGN5PSI0MiIgcj0iMy4yIi8+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MiIgcj0iMy4yIi8+PGNpcmNsZSBjeD0iMTUiIGN5PSIyOCIgcj0iMy4yIi8+PGNpcmNsZSBjeD0iMzMiIGN5PSIyOCIgcj0iMy4yIi8+PGNpcmNsZSBjeD0iMjQiIGN5PSIyOCIgcj0iMi45Ii8+PC9nPjxjaXJjbGUgY3g9IjI0IiBjeT0iNyIgcj0iNC4yIiBmaWxsPSIjMTRCOEE2Ii8+PC9zdmc+)\n\n**Instagram Profile \u0026 Posts** is an independently documented x402 Atlas bridge at https://instagram.use.x402atlas.com.\nThis document describes only this bridge; it does not aggregate routes, schemas,\nor content from any other bridge.\n\n## How payment works\n\nPaid operations use the [x402 payment protocol](https://x402.org) and settle in\nUSDC. Atlas supports deployments on Base, Polygon, and Arbitrum, plus configured\nSolana networks. This bridge currently advertises Arbitrum One (`eip155:42161`), Base (`eip155:8453`), Polygon (`eip155:137`), Solana mainnet (`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`).\n\n1. Send the HTTP request without a payment signature.\n2. Read the `402 Payment Required` response. Its `accepts` entries are the\n   authoritative network, asset, amount, and recipient options for that call.\n3. Select an option, sign it with an x402-compatible wallet or SDK, and repeat\n   the request with the `PAYMENT-SIGNATURE` header. The successful response is\n   returned after verification and settlement.\n\nTypeScript clients can automate the challenge, signing, and retry flow with\n[`x402-fetch`](https://www.npmjs.com/package/x402-fetch) or\n[`x402-axios`](https://www.npmjs.com/package/x402-axios). Fund a dedicated\nwallet only with the working USDC balance it needs and keep that key separate\nfrom treasury accounts.\n\n## Pricing\n\nAtlas route prices start at $0.005 per successful call. This bridge's fallback\nprice is $0.005; operations below state their exact configured price in\n`x-x402` and `x-payment-info`. The live `402` challenge remains authoritative.\n\n## Worked payment example\n\nRequest one documented operation without a signature to inspect its live terms:\n\n```bash\ncurl -i 'https://instagram.use.x402atlas.com/posts/nasa?cursor='\n# HTTP/1.1 402 Payment Required\n# Read accepts[].network, asset, amount, and payTo from this response.\n```\n\nSign one accepted option and repeat the identical request with the\n`PAYMENT-SIGNATURE` header. Do not invent or cache payment terms; read them from\nthe current challenge.\n\n## Use this API\n\n- Interactive reference: https://instagram.use.x402atlas.com/docs\n- OpenAPI 3.1 specification: https://instagram.use.x402atlas.com/openapi.json\n- Agent-readable route corpus: https://instagram.use.x402atlas.com/llms.txt\n- Endpoint index: https://instagram.use.x402atlas.com/index.json\n\nUse the operation schemas and examples below to construct requests. Copy the\nserver URL, path, method, parameters, and request body from the operation you\nwant to call. Path and query examples are concrete and can be used directly.\n\n## Atlas response metadata\n\nSuccessful JSON responses include an additive top-level `_atlas` block, kept\nseparate from the bridge's data fields. `_atlas.docs` links this bridge's\n`/llms.txt` corpus. `_atlas.related` suggests adjacent APIs, each with a callable\n`url`, its own `docs` link, and a short `summary`. Suppress this block by sending\n`X-Atlas-Meta: none` or by adding `?_atlas=0` to the request.\n\n## Errors and compatibility\n\nValidation failures use HTTP `400`. Paid operations may return `402` before\ndispatch. Upstream and internal failures use the documented `5xx` responses.\nClients should rely on documented fields and tolerate additive response fields,\nincluding `_atlas` unless they explicitly opt out.\n\n## Protocol reference\n\n- x402 protocol and SDKs: https://x402.org","x-guidance":"Use the operation schemas and examples to construct requests. Paid operations return an HTTP 402 challenge with the authoritative payment terms."},"servers":[{"url":"https://instagram.use.x402atlas.com"}],"tags":[{"name":"Instagram Profile \u0026 Posts"}],"paths":{"/posts/{username}":{"get":{"description":"Instagram posts feed: put the account handle in the path (`/posts/nasa` — case-insensitive, no leading `@`). Returns `{ username, posts, next_cursor, next_cursor_url }`. Each post carries `id`, `shortcode`, a derived `url` permalink, `caption` (the written caption, falling back to `accessibility_caption`), `is_video`, `video_duration` and `has_audio` for reels, `product_type`, `title`, `display_url`, `thumbnail_url`, `dimensions`, `likes`, `comments`, the `comments_disabled` / `like_and_view_counts_disabled` / `is_paid_partnership` flags, `tagged_users`, `location` when the post has one, `owner`, and `carousel` children for multi-media posts. Paging: omit `cursor` for the first page, then either pass the previous response's `next_cursor` as `?cursor=` or simply GET its `next_cursor_url`, which is the same request pre-built. Both are empty on the last page — there is deliberately no link back to page one, so following links terminates. An unknown, private or empty account — or a cursor the upstream no longer accepts — still returns `200` with `posts: []` and a `note` (the paid lookup ran, so the request is billed); only a genuine upstream failure is a `502`. This route deliberately returns no profile object; use `/profile/{username}` for follower counts and account metadata.\n\n**Price:** $0.02 per call.","operationId":"instagram_GET_posts_username","parameters":[{"name":"username","in":"path","required":true,"description":"Instagram handle as it appears in the profile URL, e.g. `nasa` for instagram.com/nasa. Case-insensitive, no leading @.","schema":{"description":"Instagram handle as it appears in the profile URL, e.g. `nasa` for instagram.com/nasa. Case-insensitive, no leading @.","maxLength":30,"pattern":"^[A-Za-z0-9._]+$","type":"string"},"example":"nasa"},{"name":"cursor","in":"query","description":"Opaque pagination token returned as `next_cursor` by a previous call. Omit or leave empty to get the first page.","schema":{"description":"Opaque pagination token returned as `next_cursor` by a previous call. Omit or leave empty to get the first page.","maxLength":1024,"type":"string"},"example":""}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"properties":{"next_cursor":{"description":"Opaque token for the next page of posts; feed it back as `?cursor=` on /instagram/posts/{username}. Empty when there is no further page.","type":"string"},"next_cursor_url":{"description":"Ready-made URL for the next page — GET it as-is (it is a paid $0.02 call like any other). Equivalent to feeding `next_cursor` back yourself. Empty when there is no further page.","type":"string"},"note":{"description":"Present only when the page came back empty (unknown, private or empty account, or an expired cursor). The paid lookup still ran.","type":"string"},"posts":{"description":"One page of the account's posts, newest first; empty when nothing public was found","items":{"properties":{"accessibility_caption":{"description":"Instagram's auto-generated image description","type":"string"},"caption":{"description":"The post's written caption; falls back to accessibility_caption when the post has no written one","type":"string"},"carousel":{"description":"Children of a multi-media post; empty for single-media posts","items":{"properties":{"dimensions":{"properties":{"height":{"type":"integer"},"width":{"type":"integer"}},"type":"object"},"display_url":{"type":"string"},"id":{"type":"string"},"is_video":{"type":"boolean"},"shortcode":{"type":"string"}},"type":"object"},"type":"array"},"comments":{"type":"integer"},"comments_disabled":{"type":"boolean"},"dimensions":{"properties":{"height":{"type":"integer"},"width":{"type":"integer"}},"type":"object"},"display_url":{"description":"Full-size image (or video cover) URL","type":"string"},"has_audio":{"type":"boolean"},"id":{"type":"string"},"is_paid_partnership":{"type":"boolean"},"is_video":{"type":"boolean"},"like_and_view_counts_disabled":{"type":"boolean"},"likes":{"type":"integer"},"location":{"description":"Tagged place; absent when the post has none","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"type":"object"},"owner":{"properties":{"id":{"type":"string"},"username":{"type":"string"}},"type":"object"},"product_type":{"description":"Post kind as Instagram labels it, e.g. feed or clips (reels)","type":"string"},"shortcode":{"description":"The post's short id, the last segment of its permalink","type":"string"},"tagged_users":{"description":"Handles tagged in the post","items":{"type":"string"},"type":"array"},"thumbnail_url":{"description":"Smaller preview of the same media as display_url — use it for grids and lists","type":"string"},"title":{"description":"Post title; only reels and clips carry one, absent on ordinary feed posts","type":"string"},"url":{"description":"Public post permalink, derived from the shortcode","type":"string"},"video_duration":{"description":"Video length in seconds. Absent on images, and also absent when the post is a video whose duration is not reported — branch on is_video, not on this field","type":"number"}},"required":["is_video","has_audio","dimensions","likes","comments","comments_disabled","like_and_view_counts_disabled","is_paid_partnership","tagged_users","carousel"],"type":"object"},"type":"array"},"username":{"description":"The normalized handle that was looked up","type":"string"}},"required":["username","posts","next_cursor","next_cursor_url"],"type":"object"},"example":{"next_cursor":"QVFEeWJzNWJXVUZ6M0xkVWhoOWc3RHhwLW5rTk1pT2h5","next_cursor_url":"https://instagram.use.x402atlas.com/posts/nasa?cursor=QVFEeWJzNWJXVUZ6M0xkVWhoOWc3RHhwLW5rTk1pT2h5","posts":[{"accessibility_caption":"Photo by NASA of the Sun's corona against a black sky.","caption":"A new view of the Sun's corona, captured during totality.","carousel":[],"comments":4102,"comments_disabled":false,"dimensions":{"height":1350,"width":1080},"display_url":"https://scontent.cdninstagram.com/v/t51.29350-15/nasa_post_1.jpg","has_audio":false,"id":"3502108108334577896","is_paid_partnership":false,"is_video":false,"like_and_view_counts_disabled":false,"likes":812345,"location":{"id":"212999109","name":"Kennedy Space Center","slug":"kennedy-space-center"},"owner":{"id":"528817151","username":"nasa"},"product_type":"feed","shortcode":"DBaVQ2Rx3Ho","tagged_users":["nasahubble"],"thumbnail_url":"https://scontent.cdninstagram.com/v/t51.29350-15/nasa_post_1_thumb.jpg","url":"https://www.instagram.com/p/DBaVQ2Rx3Ho/"},{"accessibility_caption":"Video by NASA of astronauts in training suits.","caption":"Artemis II crew training, in 60 seconds.","carousel":[],"comments":8891,"comments_disabled":false,"dimensions":{"height":1920,"width":1080},"display_url":"https://scontent.cdninstagram.com/v/t51.29350-15/nasa_post_2.jpg","has_audio":true,"id":"3498765432109876543","is_paid_partnership":false,"is_video":true,"like_and_view_counts_disabled":false,"likes":1204553,"owner":{"id":"528817151","username":"nasa"},"product_type":"clips","shortcode":"DBOxK1LvQ8m","tagged_users":[],"thumbnail_url":"https://scontent.cdninstagram.com/v/t51.29350-15/nasa_post_2_thumb.jpg","title":"Artemis II crew training","url":"https://www.instagram.com/p/DBOxK1LvQ8m/","video_duration":58.6}],"username":"nasa"}}}},"400":{"description":"Validation error — the request was rejected before the handler ran.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required. The response carries an x402 payment challenge.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"500":{"description":"Unexpected internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"x402Payment":[]}],"summary":"Page through an Instagram account's posts by username — captions, like and comment counts, media type, video duration, image and thumbnail URLs, post permalinks, tagged users and location, plus a cursor for the next page. Instagram posts feed, reels listing, creator content history, social post data. No API key.","tags":["Instagram Profile \u0026 Posts"],"x-payment-info":{"price":{"amount":"0.02","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-x402":{"discoverable":true,"enabled":true,"paid":true,"price":"$0.02","service_name":"Instagram Profile \u0026 Posts"}}},"/profile/{username}":{"get":{"description":"Instagram profile lookup: put the account handle in the path (`/profile/nasa` — case-insensitive, no leading `@`). Returns `{ username, profile, posts, next_cursor, next_cursor_url }`. `profile` carries the bio, `followers`/`following`/`posts_count`, the `is_private`/`is_verified`/`is_verified_by_meta`/`is_business_account`/`is_professional_account` flags, `category_name`, business contact fields when the account publishes them, `external_url` plus every `bio_links` entry, and both profile-picture sizes. `posts` is the first page of the account's posts in the same shape `/posts/{username}` returns — each with a derived `url` permalink, `caption`, `likes`, `comments`, media type and dimensions, `tagged_users`, `location` and `carousel` children for multi-image posts. `next_cursor` is an opaque token: pass it as `?cursor=` to `/posts/{username}` to page further, or just GET `next_cursor_url`, the ready-made link to that same next page (a normal paid $0.02 call — cheaper than re-fetching this profile route). Both are empty when there is no further page. A handle that does not exist, is private, or has nothing public still returns `200` with zeroed fields and a `note` (the paid lookup ran, so the request is billed); only a genuine upstream failure is a `502`.\n\n**Price:** $0.04 per call.","operationId":"instagram_GET_profile_username","parameters":[{"name":"username","in":"path","required":true,"description":"Instagram handle as it appears in the profile URL, e.g. `nasa` for instagram.com/nasa. Case-insensitive, no leading @.","schema":{"description":"Instagram handle as it appears in the profile URL, e.g. `nasa` for instagram.com/nasa. Case-insensitive, no leading @.","maxLength":30,"pattern":"^[A-Za-z0-9._]+$","type":"string"},"example":"nasa"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"properties":{"next_cursor":{"description":"Opaque token for the next page of posts; feed it back as `?cursor=` on /instagram/posts/{username}. Empty when there is no further page.","type":"string"},"next_cursor_url":{"description":"Ready-made URL for the next page — GET it as-is (it is a paid $0.02 call like any other). Equivalent to feeding `next_cursor` back yourself. Empty when there is no further page.","type":"string"},"note":{"description":"Present only when the lookup found nothing public (unknown, private or empty account). The paid lookup still ran.","type":"string"},"posts":{"description":"One page of the account's posts, newest first; empty when nothing public was found","items":{"properties":{"accessibility_caption":{"description":"Instagram's auto-generated image description","type":"string"},"caption":{"description":"The post's written caption; falls back to accessibility_caption when the post has no written one","type":"string"},"carousel":{"description":"Children of a multi-media post; empty for single-media posts","items":{"properties":{"dimensions":{"properties":{"height":{"type":"integer"},"width":{"type":"integer"}},"type":"object"},"display_url":{"type":"string"},"id":{"type":"string"},"is_video":{"type":"boolean"},"shortcode":{"type":"string"}},"type":"object"},"type":"array"},"comments":{"type":"integer"},"comments_disabled":{"type":"boolean"},"dimensions":{"properties":{"height":{"type":"integer"},"width":{"type":"integer"}},"type":"object"},"display_url":{"description":"Full-size image (or video cover) URL","type":"string"},"has_audio":{"type":"boolean"},"id":{"type":"string"},"is_paid_partnership":{"type":"boolean"},"is_video":{"type":"boolean"},"like_and_view_counts_disabled":{"type":"boolean"},"likes":{"type":"integer"},"location":{"description":"Tagged place; absent when the post has none","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"type":"object"},"owner":{"properties":{"id":{"type":"string"},"username":{"type":"string"}},"type":"object"},"product_type":{"description":"Post kind as Instagram labels it, e.g. feed or clips (reels)","type":"string"},"shortcode":{"description":"The post's short id, the last segment of its permalink","type":"string"},"tagged_users":{"description":"Handles tagged in the post","items":{"type":"string"},"type":"array"},"thumbnail_url":{"description":"Smaller preview of the same media as display_url — use it for grids and lists","type":"string"},"title":{"description":"Post title; only reels and clips carry one, absent on ordinary feed posts","type":"string"},"url":{"description":"Public post permalink, derived from the shortcode","type":"string"},"video_duration":{"description":"Video length in seconds. Absent on images, and also absent when the post is a video whose duration is not reported — branch on is_video, not on this field","type":"number"}},"required":["is_video","has_audio","dimensions","likes","comments","comments_disabled","like_and_view_counts_disabled","is_paid_partnership","tagged_users","carousel"],"type":"object"},"type":"array"},"profile":{"description":"The account's public profile; zeroed when the lookup found nothing (see note)","properties":{"bio_links":{"description":"Every link the account lists in its bio","items":{"properties":{"link_type":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"}},"type":"object"},"type":"array"},"biography":{"type":"string"},"business_category_name":{"type":"string"},"business_email":{"description":"Public contact email, when the account publishes one","type":"string"},"business_phone_number":{"type":"string"},"category_name":{"description":"The account's public category, e.g. Government organization","type":"string"},"external_url":{"description":"The single link in the account's header","type":"string"},"followers":{"type":"integer"},"following":{"type":"integer"},"full_name":{"type":"string"},"has_channel":{"type":"boolean"},"has_guides":{"type":"boolean"},"has_reels":{"type":"boolean"},"has_threads_profile":{"type":"boolean"},"hide_like_and_view_counts":{"type":"boolean"},"id":{"description":"Instagram's numeric account id, as a string","type":"string"},"is_business_account":{"type":"boolean"},"is_private":{"type":"boolean"},"is_professional_account":{"type":"boolean"},"is_verified":{"type":"boolean"},"is_verified_by_meta":{"type":"boolean"},"joined_recently":{"type":"boolean"},"posts_count":{"type":"integer"},"profile_pic_url":{"type":"string"},"profile_pic_url_hd":{"type":"string"},"username":{"type":"string"}},"type":"object"},"username":{"description":"The normalized handle that was looked up","type":"string"}},"required":["username","profile","posts","next_cursor","next_cursor_url"],"type":"object"},"example":{"next_cursor":"QVFEeWJzNWJXVUZ6M0xkVWhoOWc3RHhwLW5rTk1pT2h5","next_cursor_url":"https://instagram.use.x402atlas.com/posts/nasa?cursor=QVFEeWJzNWJXVUZ6M0xkVWhoOWc3RHhwLW5rTk1pT2h5","posts":[{"accessibility_caption":"Photo by NASA of the Sun's corona against a black sky.","caption":"A new view of the Sun's corona, captured during totality.","carousel":[],"comments":4102,"comments_disabled":false,"dimensions":{"height":1350,"width":1080},"display_url":"https://scontent.cdninstagram.com/v/t51.29350-15/nasa_post_1.jpg","has_audio":false,"id":"3502108108334577896","is_paid_partnership":false,"is_video":false,"like_and_view_counts_disabled":false,"likes":812345,"location":{"id":"212999109","name":"Kennedy Space Center","slug":"kennedy-space-center"},"owner":{"id":"528817151","username":"nasa"},"product_type":"feed","shortcode":"DBaVQ2Rx3Ho","tagged_users":["nasahubble"],"thumbnail_url":"https://scontent.cdninstagram.com/v/t51.29350-15/nasa_post_1_thumb.jpg","url":"https://www.instagram.com/p/DBaVQ2Rx3Ho/"},{"accessibility_caption":"Video by NASA of astronauts in training suits.","caption":"Artemis II crew training, in 60 seconds.","carousel":[],"comments":8891,"comments_disabled":false,"dimensions":{"height":1920,"width":1080},"display_url":"https://scontent.cdninstagram.com/v/t51.29350-15/nasa_post_2.jpg","has_audio":true,"id":"3498765432109876543","is_paid_partnership":false,"is_video":true,"like_and_view_counts_disabled":false,"likes":1204553,"owner":{"id":"528817151","username":"nasa"},"product_type":"clips","shortcode":"DBOxK1LvQ8m","tagged_users":[],"thumbnail_url":"https://scontent.cdninstagram.com/v/t51.29350-15/nasa_post_2_thumb.jpg","title":"Artemis II crew training","url":"https://www.instagram.com/p/DBOxK1LvQ8m/","video_duration":58.6}],"profile":{"bio_links":[{"link_type":"external","title":"NASA","url":"https://www.nasa.gov/"}],"biography":"Exploring the universe and our home planet.","category_name":"Government organization","external_url":"https://www.nasa.gov/","followers":97600000,"following":78,"full_name":"NASA","has_channel":false,"has_guides":false,"has_reels":true,"has_threads_profile":true,"hide_like_and_view_counts":false,"id":"528817151","is_business_account":false,"is_private":false,"is_professional_account":true,"is_verified":true,"is_verified_by_meta":true,"joined_recently":false,"posts_count":4212,"profile_pic_url":"https://scontent.cdninstagram.com/v/t51.2885-19/nasa_profile.jpg","profile_pic_url_hd":"https://scontent.cdninstagram.com/v/t51.2885-19/nasa_profile_hd.jpg","username":"nasa"},"username":"nasa"}}}},"400":{"description":"Validation error — the request was rejected before the handler ran.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required. The response carries an x402 payment challenge.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"500":{"description":"Unexpected internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"x402Payment":[]}],"summary":"Full Instagram profile by username — bio, follower and following counts, posts count, verified and business account flags, category, contact email, external and bio links, profile picture, plus the first page of recent posts and a cursor for more. Instagram profile lookup, creator and influencer stats, follower count, social audience data. No API key.","tags":["Instagram Profile \u0026 Posts"],"x-payment-info":{"price":{"amount":"0.04","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-x402":{"discoverable":true,"enabled":true,"paid":true,"price":"$0.04","service_name":"Instagram Profile \u0026 Posts"}}}},"components":{"schemas":{"Error":{"properties":{"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"type":"object"}},"required":["error"],"type":"object"},"PaymentRequired":{"description":"x402 payment-required envelope. The exact shape comes from the x402 SDK and includes per-network accepted payment options. See https://x402.org for the canonical schema.","type":"object"}},"securitySchemes":{"x402Payment":{"description":"Pay the route via x402 (https://x402.org). The 402 response carries the payment challenge; resubmit with a PAYMENT-SIGNATURE header.","scheme":"x402","type":"http"}}}}
