Instagram data, ready when you are.
Profiles, posts, comments, followers, hashtags and similar accounts from Instagram.
- See the price before every call
- Pay only for records that come back
- No subscription. Your balance never expires
What you can get.
- $0.0018per recordTry it →
Profiles
Name, headline, company, skills and work history.
- $0.0018per recordTry it →
Posts by a person
A person's latest posts, with likes and comments.
- $0.00045per recordTry it →
Similar
Accounts related to one account, for finding more like it.
- $0.00045per recordTry it →
Hashtag
Posts TAGGED with a hashtag. Instagram's public listening surface. 'top' is the ranked timeline; 'newest' is chronological.
- $0.00045per recordTry it →
Search
Instagram's own account search. Find handles by name or keyword.
- $0.00045per recordTry it →
Comments
Top comments on up to ten Instagram POSTS, by /p/ or /reel/ URL (or a bare shortcode). Author is free text. Commenters are not corpus members.
- $0.000675per recordTry it →
Followers
The followers OR the following list of up to ten public accounts. The discovered accounts become thin corpus rows and a directed follow edge.
What the data looks like.
| username | fullName | biography | category | isVerified | isBusiness | followers | following | mediaCount | engagementRate | location | igUserId | avatarUrl | externalUrl | isPrivate | lastPostedAt | details |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| brewlab.coffee | Brewlab Coffee | Small-batch roasters · Austin, TX | Coffee shop | false | true | 48,210 | 312 | 864 | 0.031 | Austin, Texas | 456125832 | https://img.instagram.com/brewlab-coffee.jpg | https://www.instagram.com/brewlab-coffee-1000 | false | 2026-10-05 |
|
| mira.moves | Mira | Pilates | Pilates for busy people · new class every Monday | Fitness trainer | true | true | 182,400 | 540 | 1,210 | 0.046 | Mumbai, India | 908365941 | https://img.instagram.com/mira-pilates.jpg | https://www.instagram.com/mira-pilates-1001 | false | 2026-10-11 |
|
| northfold.studio | Northfold Studio | Brand and product design | Design studio | false | true | 9,120 | 201 | 302 | 0.022 | London | 2725119329 | https://img.instagram.com/northfold-studio.jpg | https://www.instagram.com/northfold-studio-1002 | false | 2026-10-03 |
|
For developers
API reference.
One endpoint, POST /v1/instagram. Open an operation to see its fields.
Profilesprofiles
Profile cards for up to ten accounts. Profile-only by default. A call that also wants each account's recent posts says `include.posts` and gets profiles AND posts in one call, one answer.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Usernames or profile URLs. |
| fields | list of enum | 'contact' adds the business email/phone fields to the answer; the fetch is the same either way, so this shapes the RESPONSE, not the bill.profile · contact |
| include | object | |
| include.posts | object | |
| include.posts.limit | integer · 1-48 | Recent posts to fetch per account, newest first; 1-48. |
| include.posts.tab | enum | Which tab to read: the grid ("posts") or Reels ("reels").posts · reels |
| include.posts.since | string · YYYY-MM-DD | Only posts on or after this day (YYYY-MM-DD). Omit for the newest. |
Response fields, each row of data
| Field | Type |
|---|---|
| username | string |
| igUserId | string |
| fullName | string |
| biography | string |
| avatarUrl | string |
| profileUrl | string |
| externalUrl | string |
| bioLinks | list of object |
| category | string |
| isVerified | boolean |
| isPrivate | boolean |
| isBusiness | boolean |
| followers | integer |
| following | integer |
| mediaCount | integer |
| highlightReelCount | integer |
| engagementRate | number |
| contactEmail | string |
| contactPhone | string |
| location | string |
| businessStreet | string |
| businessZip | string |
| businessCityId | string |
| businessLatitude | number |
| businessLongitude | number |
| facebookPage | object |
| lastPostedAt | string |
| recentPosts | list of object |
| relatedAccounts | list of object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/instagram \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"profiles","subjects":["natgeo","nike"]}'Example response rows
[
{
"username": "brewlab.coffee",
"fullName": "Brewlab Coffee",
"biography": "Small-batch roasters · Austin, TX",
"category": "Coffee shop",
"isVerified": false,
"isBusiness": true,
"followers": 48210,
"following": 312,
"mediaCount": 864,
"engagementRate": 0.031,
"location": "Austin, Texas",
"igUserId": "456125832",
"avatarUrl": "https://img.instagram.com/brewlab-coffee.jpg",
"externalUrl": "https://www.instagram.com/brewlab-coffee-1000",
"isPrivate": false,
"lastPostedAt": "2026-10-05",
"details": {}
},
{
"username": "mira.moves",
"fullName": "Mira | Pilates",
"biography": "Pilates for busy people · new class every Monday",
"category": "Fitness trainer",
"isVerified": true,
"isBusiness": true,
"followers": 182400,
"following": 540,
"mediaCount": 1210,
"engagementRate": 0.046,
"location": "Mumbai, India",
"igUserId": "908365941",
"avatarUrl": "https://img.instagram.com/mira-pilates.jpg",
"externalUrl": "https://www.instagram.com/mira-pilates-1001",
"isPrivate": false,
"lastPostedAt": "2026-10-11",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Posts by a personposts
One account's recent posts, newest first. The grid or the Reels tab. With the author's profile card in the same answer.
| Field | Type | Meaning |
|---|---|---|
| subject * | string · ≤400 chars | One username or profile URL. |
| limit | integer · 1-48 | |
| tab | enum | 'reels' pulls the Reels tab instead of the grid. Non-default tabs and date floors always fetch fresh (they never touch the grid's cache markers) and are served fresh from a source that has them.posts · reels |
| since | string · YYYY-MM-DD |
Response fields, each row of data
| Field | Type |
|---|---|
| shortCode | string |
| igMediaId | string |
| caption | string |
| kind | string |
| productType | string |
| postedAt | string |
| permalink | string |
| mediaUrl | string |
| videoUrl | string |
| images | list of string |
| media | list of object |
| width | integer |
| height | integer |
| likes | integer |
| comments | integer |
| views | integer |
| plays | integer |
| saves | integer |
| shares | integer |
| videoDuration | number |
| language | string |
| likesHidden | boolean |
| isPinned | boolean |
| isPaidPartnership | boolean |
| hashtags | list of string |
| mentions | list of string |
| owner | object |
| taggedUsers | list of object |
| coauthors | list of object |
| sponsors | list of object |
| locationName | string |
| locationId | string |
| music | object |
| firstComment | string |
| recentComments | list of object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/instagram \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"posts","subject":"natgeo","limit":12}'Example response rows
[
{
"owner": {
"username": "brewlab.coffee"
},
"caption": "New single origin from Chikmagalur ☕ #specialtycoffee",
"kind": "image",
"postedAt": "2026-10-15T08:00:00Z",
"likes": 2140,
"comments": 88,
"hashtags": [
"specialtycoffee"
],
"views": null,
"videoDuration": null,
"igMediaId": "1315471224",
"permalink": "https://www.instagram.com/new-single-origin-from-chikmagalur-speci-1000",
"mediaUrl": "https://www.instagram.com/new-single-origin-from-chikmagalur-speci-1000",
"isPinned": false,
"isPaidPartnership": false,
"details": {}
},
{
"owner": {
"username": "brewlab.coffee"
},
"caption": "How we dial in espresso every morning",
"kind": "reel",
"postedAt": "2026-10-12T07:30:00Z",
"likes": 5310,
"comments": 142,
"hashtags": [
"espresso",
"baristalife"
],
"views": 88400,
"videoDuration": 41,
"igMediaId": "1973392646",
"permalink": "https://www.instagram.com/how-we-dial-in-espresso-every-morning-1001",
"mediaUrl": "https://www.instagram.com/how-we-dial-in-espresso-every-morning-1001",
"isPinned": false,
"isPaidPartnership": false,
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Similarsimilar
Accounts related to one account, for finding more like it.
| Field | Type | Meaning |
|---|---|---|
| subject * | string · ≤400 chars | One username or profile URL. |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| username | string |
| fullName | string |
| igUserId | string |
| isVerified | boolean |
| isPrivate | boolean |
| avatarUrl | string |
| profileUrl | string |
| followers | integer |
| profile | object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/instagram \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"similar","subject":"natgeo","limit":20}'Example response rows
[
{
"username": "roastery.co",
"fullName": "Roastery Co.",
"followers": 61200,
"details": {}
},
{
"username": "dailygrind.cafe",
"fullName": "Daily Grind",
"followers": 23400,
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Hashtaghashtag
Posts TAGGED with a hashtag. Instagram's public listening surface. 'top' is the ranked timeline; 'newest' is chronological.
| Field | Type | Meaning |
|---|---|---|
| hashtag * | string · ≤150 chars | |
| sort | enum | top · newest |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| shortCode | string |
| igMediaId | string |
| caption | string |
| kind | string |
| productType | string |
| postedAt | string |
| permalink | string |
| mediaUrl | string |
| videoUrl | string |
| images | list of string |
| media | list of object |
| width | integer |
| height | integer |
| likes | integer |
| comments | integer |
| views | integer |
| plays | integer |
| saves | integer |
| shares | integer |
| videoDuration | number |
| language | string |
| likesHidden | boolean |
| isPinned | boolean |
| isPaidPartnership | boolean |
| hashtags | list of string |
| mentions | list of string |
| owner | object |
| taggedUsers | list of object |
| coauthors | list of object |
| sponsors | list of object |
| locationName | string |
| locationId | string |
| music | object |
| firstComment | string |
| recentComments | list of object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/instagram \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"hashtag","hashtag":"streetphotography","sort":"top","limit":20}'Example response rows
[
{
"owner": {
"username": "mira.moves"
},
"caption": "10-minute core flow, save it for later #pilates",
"kind": "reel",
"postedAt": "2026-10-13T06:00:00Z",
"likes": 18250,
"comments": 412,
"views": 241000,
"videoDuration": 58,
"hashtags": [
"pilates",
"corestrength"
],
"igMediaId": "2465709650",
"permalink": "https://www.instagram.com/10-minute-core-flow-save-it-for-later-pi-1000",
"mediaUrl": "https://www.instagram.com/10-minute-core-flow-save-it-for-later-pi-1000",
"isPinned": false,
"isPaidPartnership": false,
"details": {}
},
{
"owner": {
"username": "studio.flow"
},
"caption": "Reformer basics for week one #pilates",
"kind": "reel",
"postedAt": "2026-10-12T17:20:00Z",
"likes": 6400,
"comments": 120,
"views": 91200,
"videoDuration": 33,
"hashtags": [
"pilates",
"reformer"
],
"igMediaId": "1592716932",
"permalink": "https://www.instagram.com/reformer-basics-for-week-one-pilates-1001",
"mediaUrl": "https://www.instagram.com/reformer-basics-for-week-one-pilates-1001",
"isPinned": false,
"isPaidPartnership": false,
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Searchsearch
Instagram's own account search. Find handles by name or keyword.
| Field | Type | Meaning |
|---|---|---|
| query * | string · ≤300 chars | |
| limit | integer · 1-25 |
Response fields, each row of data
| Field | Type |
|---|---|
| username | string |
| fullName | string |
| igUserId | string |
| isVerified | boolean |
| isPrivate | boolean |
| avatarUrl | string |
| profileUrl | string |
| followers | integer |
| profile | object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/instagram \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"search","query":"coffee roasters","limit":10}'Example response rows
[
{
"username": "mira.moves",
"fullName": "Mira | Pilates",
"followers": 182400,
"details": {}
},
{
"username": "corewithkai",
"fullName": "Kai Tan",
"followers": 96300,
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Commentscomments
Top comments on up to ten Instagram POSTS, by /p/ or /reel/ URL (or a bare shortcode). Author is free text. Commenters are not corpus members.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Post URLs (/p/ or /reel/) or bare shortcodes. |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| igCommentId | string |
| author | string |
| body | string |
| score | integer |
| commentedAt | string |
| commenter | object |
| replyCount | integer |
| commentUrl | string |
| postUrl | string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/instagram \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"comments","subjects":["https://www.instagram.com/p/<shortcode>/"],"limit":50}'Example response rows
[
{
"author": "ravi.k",
"body": "Tried this today, so good!",
"score": 42,
"commentedAt": "2026-10-15T09:10:00Z",
"igCommentId": "1406279790",
"details": {}
},
{
"author": "lena_m",
"body": "Which beans do you use?",
"score": 18,
"commentedAt": "2026-10-15T09:44:00Z",
"igCommentId": "3977780793",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Followersfollowers
The followers OR the following list of up to ten public accounts. The discovered accounts become thin corpus rows and a directed follow edge.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Usernames or profile URLs. |
| direction | enum | followers · following |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| username | string |
| fullName | string |
| igUserId | string |
| isVerified | boolean |
| isPrivate | boolean |
| avatarUrl | string |
| profileUrl | string |
| followers | integer |
| profile | object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/instagram \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"followers","subjects":["natgeo"],"direction":"following","limit":50}'Example response rows
[
{
"username": "ravi.k",
"fullName": "Ravi Kumar",
"followers": 412,
"details": {}
},
{
"username": "lena_m",
"fullName": "Lena M.",
"followers": 2100,
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Historyhistoryfree
The stored time series. Free, reads only what captures already wrote.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Usernames or profile URLs. |
| metric | enum | followers · following · media_count · engagement_rate |
| days | integer · 1-730 |