# Instagram Posts API. Pay per record.

> An Instagram account's recent posts or Reels as JSON: caption, likes, comments, views and hashtags. From $0.0018 per post.

Canonical: https://apiforagents.dev/platforms/instagram/posts-api · Updated 2026-10-21

Get one Instagram account's recent posts, newest first, from the grid or the Reels tab: caption, type, date, likes, comments, views, hashtags and permalink. The author's profile card comes in the same answer.

- Price: $0.0018 / post
- Billed: Per record
- Free to start: $0.10
- Endpoint: POST /v1/instagram

## What people build with the Instagram Posts API

- **Track a competitor's content.** See what a brand posted this month and which posts got the most likes and comments.
- **Audit a creator.** Read the last 48 posts of an account, spot paid partnerships and check real engagement per post.
- **Feed an agent.** Give your agent an account's recent captions and hashtags before it writes about that brand.

## Quote it, then run it

1. free quote: the exact price, nothing charged:

```bash
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,"estimateOnly":true}'
```

2. the same call, run:

```bash
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}'
```

## Inputs

Everything you can send in one posts call. Required inputs first.

| Input | Type | What it does |
|---|---|---|
| subject * | string | One username or profile URL. ≤400 chars |
| 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. |
| since | string | YYYY-MM-DD |

## What comes back

The fields of every row, always present. Nothing is guessed: a value that could not be measured is null, and the answer's coverage says why.

| 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 |

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.

## A sample answer

Made-up names and values in the real field names, so you can see the shape before you spend anything.

| owner | caption | kind | postedAt | likes | comments |
|---|---|---|---|---|---|
| {"username":"brewlab.coffee"} | New single origin from Chikmagalur ☕ #specialtycoffee | image | 2026-10-15T08:00:00Z | 2140 | 88 |
| {"username":"brewlab.coffee"} | How we dial in espresso every morning | reel | 2026-10-12T07:30:00Z | 5310 | 142 |
| {"username":"brewlab.coffee"} | Autumn menu, swipe for all 6 drinks | carousel | 2026-10-05T10:15:00Z | 3020 | 97 |

## Pricing

Pay as you go, in US dollars, per record. No subscription, nothing expires, $5 first top-up, and every new agent starts with $0.10 free.

| Request | Records | At the list price |
|---|---|---|
| One post | 1 | $0.0018 |
| 10 posts | 10 | $0.018 |
| A full page | 48 | $0.086 |

These are per-record list prices. Some calls also carry a minimum, such as a page of search results, so a small request can cost more than the table shows. The quote ("estimateOnly": true) is free, gives the most your exact request can cost, and the charge then settles to what came back. Records that do not come back are refunded.

## Try it without writing code

- [Open the Instagram Posts API in the playground](https://apiforagents.dev/dashboard/run?platform=instagram&op=posts): The playground runs any endpoint by hand: pick a platform and what you want from it, fill a short form named in plain words (or press Use sample input), see the free quote on the Run button, run it, then read the answer as a table or JSON and download it as CSV or JSON. The same call is written out as cURL, Python and Node while you type.

## Why this one, and not a scraper you run yourself

- No login, no Instagram account, no cookies, no proxies, no browser to babysit.
- When the site changes its pages, your request stays the same: keeping the reads working is our job, not yours.
- A fetch that fails costs nothing: it is named in the answer with a reason, and the quote says the most a call can cost before it runs.

## Use it from your tools

- [Instagram in n8n](https://apiforagents.dev/integrations/n8n/instagram)
- [Instagram in Make](https://apiforagents.dev/integrations/make/instagram)
- [Instagram in Zapier](https://apiforagents.dev/integrations/zapier/instagram)
- [Instagram in Python](https://apiforagents.dev/integrations/python/instagram)
- [Instagram in LangChain](https://apiforagents.dev/integrations/langchain/instagram)
- [Instagram in Claude Code](https://apiforagents.dev/integrations/claude-code/instagram)

## Questions

### What does the Instagram Posts API return?

One row per post: author username, caption, kind, posted date, likes, comments, hashtags, views and duration for video, media id, permalink, media URL, whether it is pinned and whether it is marked as a paid partnership.

### What do I pass in?

One username or profile URL in subject, a limit from 1 to 48, tab set to posts or reels, and an optional since date (YYYY-MM-DD) to stop at a given day.

### How much does it cost?

$0.0018 per post at the list price. A small call can carry a minimum, so quote first with "estimateOnly": true, which is free and is the most the call can cost. You pay for what comes back.

## Why API for Agents

- One key for 26 platforms: social, commerce, jobs, places, search and contacts, with one request shape and one response shape.
- A free quote before any spend: add "estimateOnly": true to any call and see the most it can cost.
- Pay per record in US dollars. No subscription, nothing expires, top-ups from $5.
- $0.10 free to try, no card. An AI agent can sign itself up in one request; a person claims it later.
- Measured, not estimated: every answer says when each row was measured, whether it was fresh or a recent capture, and how sure to be of each field.
- Partial success is success: anything that could not be fetched is named with a reason, and the charge settles to what came back, never above the quote.
- Typed fields that keep their names whichever source answered, and a details object last with everything else the source sent, under our own field names.
- Try any endpoint in the playground and download the answer as CSV or JSON.

## Start

The playground runs any endpoint by hand: pick a platform and what you want from it, fill a short form named in plain words (or press Use sample input), see the free quote on the Run button, run it, then read the answer as a table or JSON and download it as CSV or JSON. The same call is written out as cURL, Python and Node while you type. Open it at https://apiforagents.dev/dashboard/run?platform=instagram&op=posts (sign in first).

Agents register at https://apiforagents.dev/auth.md (one POST, $0.10 free). People: https://apiforagents.dev/docs#start. Prices: https://apiforagents.dev/pricing.md
