Instagram API

Instagram Post API

A single Instagram post or reel by URL: id, shortcode, type, owner, like count and media URLs.

$0.50/1k req, pay per request, no subscription.

What the API returned
{
"id": "3401000000000000000",
"shortcode": "C8aBcDeFgHi",
"type": "XDTGraphVideo",
"owner": "nasa",
"likes": 1840000,
"displayUrl": "https://instagram.com/p/C8aBcDeFgHi/media.jpg",
"videoUrl": "https://instagram.com/p/C8aBcDeFgHi/media.mp4",
"altText": string | null,
... 26 more fields
}
Uptime
99.95%
30d · 158,351 calls
Requests
158,681
30d · weekly, last 12 wks
Response
2.9s
median · 30d

Pricing and providers

Instagram Post API pricing: one API, 5 interchangeable providers

The cheapest provider serves first. If it fails, the next one takes over in the same call.

You pay
$5.00
$0.50/1k req, only for what you use. No monthly plan.
Your first 200 requests are free with the $0.10 starting balance.

Try it

Get Instagram post in one request

requireFieldsarray
Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `plays`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a post that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge.
Open in
Get a free key
Sample response
Free runs return only the first 3 results. Fund a key to get the full response.

This sample shows 9 of 37 fields. See every field

{
  "found": true,
  "data": {
    "id": "3401000000000000000",
    "shortcode": "C8aBcDeFgHi",
    "type": "XDTGraphVideo",
    "owner": "nasa",
    "likes": 1840000,
    "displayUrl": "https://instagram.com/p/C8aBcDeFgHi/media.jpg",
    "videoUrl": "https://instagram.com/p/C8aBcDeFgHi/media.mp4"
  }
}

Full parameter and response reference - every field, type, and example for this endpoint.

Reference

One request, one response shape.

Every field you send and every field you get back, each with a real example.

Last verified 2026-10-31 · uptime and latency measured over 30d

Request body

JSON, posted to this endpoint.

  • urlstring

    https://www.instagram.com/p/C8aBcDeFgHi/

    Full Instagram post or reel URL, carrying the media shortcode: /p/, /reel/, /reels/, or /tv/. A profile URL such as https://www.instagram.com/username names no post, so it is rejected instead of charged for an empty result - send that account's handle to instagram.profile, or its posts to instagram.user_posts.

  • hostVideoboolean

    Set true to also get the post's video on a hosted MP4 link that plays without an Instagram session. The file is downloaded and stored for you, and the response adds `hostedUrl`, `expiresUtc` and `bytes`. It is charged as an extra on top of the price, and it never changes which source serves you: every source offers it at the same price. A post with no video, or a post that does not exist, is refused with no charge rather than billed for a file that cannot exist. Omit it and nothing is downloaded, nothing is stored, and nothing extra is charged.

  • requireFieldsarray

    Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `plays`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a post that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge.

  • requirePlayCountboolean

    Deprecated; send `requireFields: ["plays"]` instead, which does exactly the same thing. Set true to be served only by a source that reports a reel's play count. Omit it and routing is unchanged, with the cheapest source serving, which does not carry play counts, so `plays` is absent from its responses. This can raise your price: opting in routes to a source that reports the count, and you are quoted and charged its price. It stays accepted so callers that already send it keep working.

You send. A small JSON body. The values shown are examples to replace with your own.

Response

JSON, one example value per field.

datadata
  • altTextstringcan require

    Instagram's generated accessibility description of the media. Null when this source does not report it.

  • audioIdstringcan require

    Instagram audio id of the sound; pass it to instagram.audio_reels as audioId to list other reels using it. Null when the media has no sound or this source does not report it.

  • avatarUrlstring

    Profile picture URL of the posting account.

  • bytesinteger

    Size of the hosted MP4 in bytes. Present only when the request set `hostVideo` to true.

  • captionstring

    Caption text of the post, including its hashtags and @mentions. Empty when the post has no caption. Populated whenever the provider has data for the entity.

  • commentsinteger

    Number of comments on the post.

  • countsHiddenbooleancan require

    Whether the author has hidden the like and view counts. Null when this source does not report it.

  • createdUtcnumber

    UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.

  • displayNamestring

    Display name of the posting account.

  • displayUrlstring

    https://instagram.com/p/C8aBcDeFgHi/media.jpg

    Populated whenever the provider has data for the entity.

  • durationSecondsnumbercan require

    Video duration in seconds. Null on a photo, or when this source does not report it.

  • expiresUtcinteger

    When `hostedUrl` stops working, as a UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Present only when the request set `hostVideo` to true.

  • hasAudiobooleancan require

    True when the media carries an audio track.

  • hashtagsstring[]

    Hashtags carried in the caption, each including its leading #. Empty when the caption uses none. Populated whenever the provider has data for the entity.

  • hostedUrlstring

    AnyAPI-hosted MP4 of this post's video, playable without an Instagram session. Present only when the request set `hostVideo` to true.

  • idstring

    3401000000000000000

    Populated whenever the provider has data for the entity.

  • likesinteger

    1840000

  • locationIdstringcan require

    Instagram id of the tagged place, when the post tags one.

  • locationLatnumbercan require

    Latitude of the tagged location, in decimal degrees. Null when the post tags no place or this source does not report it.

  • locationLngnumbercan require

    Longitude of the tagged location, in decimal degrees. Null when the post tags no place or this source does not report it.

  • locationNamestring

    Name of the tagged place, when the post tags one.

  • mentionsstring[]

    Accounts mentioned in the caption, each including its leading @, in caption order. Empty when the caption mentions none.

  • ownerstring

    nasa

    Populated whenever the provider has data for the entity.

  • paidPartnershipboolean

    True when the post is tagged as a paid partnership.

  • playsintegercan require

    Number of plays of the reel or video. Absent when Instagram does not expose a play count for this media, and on lanes that cannot serve it.

  • productTypestring

    Instagram product type of the media, for example feed, clips or igtv.

  • resharesintegercan require

    Number of times the post has been reshared. Null when this source does not report it.

  • shortcodestring

    C8aBcDeFgHi

  • soundAuthorstringcan require

    Credited author of the sound. Null when the media has no sound or this source does not report it.

  • soundTitlestringcan require

    Name of the sound. "Original audio" means the creator's own audio rather than a licensed track. Null when the media has no sound or this source does not report it.

  • typestring

    XDTGraphVideo

  • userIdstring

    Instagram user id of the posting account.

  • verifiedboolean

    True when the posting account carries a verified badge.

  • videoUrlstring

    https://instagram.com/p/C8aBcDeFgHi/media.mp4

top level
  • foundboolean

    true

  • reason"not_found"

    Present only when `found` is false, and says why there is no result. `not_found`: the source states the target does not exist, or returned nothing for it. A `found: false` answer is a successful call, not an error, and `costUsd` is what it actually cost.

You get back. Named, typed fields in the same shape whichever source answers.

Selling this API? See the full schema your endpoint must return.

FAQ

About the Instagram Post API

The AnyAPI Instagram Post API returns Instagram post data as normalized JSON from one POST call to /v1/run/instagram.post. A single Instagram post or reel by URL: id, shortcode, type, owner, like count and media URLs. AnyAPI routes each request across 5 sources and falls back automatically when one fails. It costs from $0.50 per 1,000 requests, in US dollars with no subscription and no monthly minimum. Over the last 30 days, 99.9% of Instagram post calls through AnyAPI succeeded, with a median response time of 2.9 seconds across 158,351 measured calls.

It costs from $0.50 per 1,000 requests, in US dollars with no subscription and no monthly minimum. You fund one USD wallet and each call draws it down. Some failed wallet-funded requests incur processing charges that we pass through at cost, with no markup; the error response shows the amount charged.

A single Instagram post or reel by URL: id, shortcode, type, owner, like count and media URLs. The response is normalized JSON with the same envelope every AnyAPI endpoint returns, so parsing a second endpoint is a change of URL and nothing else.

Over the last 30 days, 99.9% of Instagram post calls through AnyAPI succeeded, with a median response time of 2.9 seconds across 158,351 measured calls. These are AnyAPI's own measurements of traffic through the gateway, recomputed continuously, not a published service-level target.

Yes. A new AnyAPI account starts with $0.10 of free balance and no card required, which covers 200 Instagram Post calls at $0.0005 each.

AnyAPI asks the next of its 5 sources in the same request, cheapest first, so one source going down does not fail your call.

Send a POST request to https://api.getanyapi.com/v1/run/instagram.post with your AnyAPI key in an "Authorization: Bearer" header and the input as a JSON body. The same key and the same wallet work on every AnyAPI endpoint.

No. You add US dollars to one prepaid AnyAPI balance and each request draws it down. There is no monthly plan and no minimum, and the same balance pays for every AnyAPI endpoint.

Yes. Install @getanyapi/sdk from npm for TypeScript or getanyapi from pip for Python. Both call every AnyAPI endpoint with the same key, and any HTTP client works too.

Yes. An agent can connect to the AnyAPI MCP server at https://api.getanyapi.com/mcp, or create its own free-trial key with one unauthenticated POST to https://api.getanyapi.com/agent/signup and call this endpoint over HTTP.