Instagram Posts API and MCP — Captions, Likes, Comments & Media
Send an Instagram username, profile URL or single post URL and this source returns posts as data: caption, hashtags, mentions, tagged accounts, likes, comments, plays and duration for videos, media URLs, location, sponsored flag and publish date.
- You send
- An Instagram username, profile URL or post URL
- You get back
- Posts with caption, hashtags, mentions, engagement, media and date
- Coverage
- Posts on public Instagram accounts.
- Price
- 5 points per returned post, up to 1,000 per request — $5 per 1,000
- Billed per post actually returned, capped by max_items. A private account or an empty window costs nothing.
Ways to get this data
Three approaches teams use today, and where each one runs into trouble.
| Approach | What it takes | Cost | Trade-off |
|---|---|---|---|
| Scrolling the feed | Open the profile and copy what you see | Free, and slow | No consistent numbers across accounts or over time |
| A social analytics suite | A seat licence and onboarding | Monthly or annual contract | Dashboards first; raw post data is harder to get out |
| NeuralVerge | One request per account | $5 per 1,000, misses not billed | Public engagement only — no reach, saves or impressions |
What you get back
Every field in the example response below.
| Field | Type | Description |
|---|---|---|
total_items | number | How many posts came back. |
items[].id | string | Instagram's media ID. |
items[].short_code | string | The code in the post's URL. |
items[].url | string | Direct link to the post. |
items[].type | string | Image, Video or Sidecar (a carousel). |
items[].caption | string | Post caption. |
items[].hashtags | array | Hashtags in the caption. |
items[].mentions | array | Accounts mentioned in the caption. |
items[].timestamp | string | When the post was published (ISO 8601). |
items[].likes_count | number | Likes on the post. |
items[].comments_count | number | Comments on the post. |
items[].video_play_count | number | null | Plays, for videos and reels. |
items[].video_duration | number | null | Video length in seconds. |
items[].display_url | string | The main image or video cover. |
items[].video_url | string | null | The video file, for videos and reels. |
items[].owner_username | string | The account that published the post. |
items[].location_name | string | null | The tagged location, if any. |
items[].tagged_users | array | Accounts tagged in the media. |
items[].is_sponsored | boolean | Whether the post is marked as sponsored. |
items[].music | object | null | Audio used: artist, song and whether it's original audio. |
Example response
A real response, as returned.
{
"session_id": "da05db15-accd-4125-b34f-83d363e316d2",
"kind": "instagram_posts",
"url": "https://www.instagram.com/natgeo/",
"max_items": 2,
"partial": false,
"machine": {
"total_items": 2,
"items": [
{
"id": "4015345029736786094",
"short_code": "De5XwfEF2iu",
"url": "https://www.instagram.com/p/De5XwfEF2iu/",
"type": "Sidecar",
"caption": "National Geographic photographer @jaimerojo has spent over 20 years photographing monarch butterflies across North America, following their annual migrations from the forests of Mexico to Canada. …",
"hashtags": [],
"mentions": ["jaimerojo"],
"timestamp": "2026-10-25T21:00:01.000Z",
"likes_count": 139243,
"comments_count": 205,
"video_play_count": null,
"owner_username": "natgeo",
"owner_full_name": "National Geographic",
"tagged_users": ["natgeoanimals"],
"is_pinned": false,
"is_sponsored": false,
"child_posts_count": 4
},
{
"id": "4016464237135297959",
"short_code": "De9WPGLgn2n",
"url": "https://www.instagram.com/p/De9WPGLgn2n/",
"type": "Video",
"caption": "There's more to Grenada than sun, sea, and sand. The rich volcanic soil makes fertile ground for the island's signature spices—nutmeg, mace, and clove. …",
"hashtags": [],
"mentions": ["golsh"],
"timestamp": "2026-10-26T13:05:58.000Z",
"likes_count": 10549,
"comments_count": 43,
"video_play_count": 240966,
"video_duration": 15.893333,
"owner_username": "natgeo",
"owner_full_name": "National Geographic",
"is_sponsored": false,
"music": { "artist": "natgeo", "song": "Original audio", "uses_original_audio": true }
}
],
"errors": []
},
"total_points": 10
}How to run it
The same lookup works from the app, the API, or as a tool an agent can call mid-task.
This endpoint is synchronous: the call blocks until the lookup completes and returns the records directly. If a lookup hits its time budget before finishing, the response comes back with partial: true and whatever it collected so far — re-run with a smaller max_items for a complete result. url is required and accepts a username, profile URL or post URL. Optional: max_items (1-1,000, default 20), newer_than (a date like 2026-01-01 or a period like 30 days).
curl -X POST https://api.neuralverge.ai/functions/v1/run-instagram-posts \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "natgeo", "max_items": 20, "newer_than": "30 days" }'What teams use it for
Where this field shows up in an actual workflow.
See what competitors post, how often, and what gets engagement.
Check real engagement on recent posts before a partnership, not just follower count.
Collect captions, hashtags and mentions to see how a campaign was run.
Use mentions, tags and sponsored flags to see who a brand works with.
Coverage, freshness and limits
What this source covers, how fresh it is, and where it stops.
Posts on public Instagram accounts.
Read at request time — engagement counts are a snapshot at that moment.
This source returns content an account published publicly, stamped with the URL it was read from and a session id you can trace. Accounts can belong to individuals as well as brands — use it for legitimate business purposes under your own lawful basis and check the acceptable use policy.
- —Private accounts can't be read.
- —Reach, impressions and saves are private to the account owner and are not returned.
- —Engagement on very recent posts is still climbing, so compare posts of similar age.
Questions, answered
Yes — every Data Source endpoint, including this one, is synchronous: the lookup runs inside the request and the result comes back in the same response, no polling. If a lookup hits its time budget before finishing, the response comes back with partial: true and whatever records it collected so far — re-run with a smaller max_items to get a complete result instead of a partial one.
Related sources
Try instagram posts on your own data
One request format across every source in the catalog.