# Instadata: Instagram Data API > Profiles, posts, reels, comments, hashtags, places, Meta Ad Library ads and reel transcripts from public Instagram as JSON. One REST API, a hosted MCP server and agent skills. Base URL: https://api.instadata.dev. Auth: `Authorization: Bearer ik_live_...` (keys from https://instadata.dev/app/keys, 25 free credits at signup, no card; free keys return up to 5 items per list call). Every response is `{ data, meta?, request_id }`. Lists take `limit` (max 50 synchronous; more becomes a job) and `cursor`; any call takes `fresh=true`, `fields=a,b.c` and `format=json|csv|text`. Failed calls are never charged. Instadata is an independent API for publicly available Instagram data and is not affiliated with Instagram or Meta Platforms, Inc. ## Endpoints - GET https://api.instadata.dev/v1/instagram/transcript?url=… — 1 credit + 20 per started minute. Spoken words of a public reel or video post as plain text. 1 credit for the reel plus 20 per started minute of video. - GET https://api.instadata.dev/v1/instagram/summary?url=… — 4 credit + 20 per started minute. Short summary and key points of a public reel or video post, built on the same per-minute transcript. 4 credits plus 20 per started minute of video. - GET https://api.instadata.dev/v1/instagram/stats?url=… — 1 credit per post - GET https://api.instadata.dev/v1/instagram/comments?url=… — 1 credit per comment, paginated - GET https://api.instadata.dev/v1/instagram/channel-stats?handle=… — 1 credit per profile - GET https://api.instadata.dev/v1/instagram/channel-posts?handle=… — 1 credit per post, paginated - GET https://api.instadata.dev/v1/instagram/channel-reels?handle=… — 1 credit per reel, paginated - GET https://api.instadata.dev/v1/instagram/reels-search?query=… — 1 credit per result, paginated - GET https://api.instadata.dev/v1/instagram/download?url=… — 8 credits per video - GET https://api.instadata.dev/v1/instagram/profile-full?handle=… — 1 credit per profile - GET https://api.instadata.dev/v1/instagram/profile-about?handle=… — 4 credits per profile - GET https://api.instadata.dev/v1/instagram/similar?handle=… — 1 credit per profile - GET https://api.instadata.dev/v1/instagram/tagged?handle=… — 1 credit per post, paginated - GET https://api.instadata.dev/v1/instagram/hashtag-posts?query=… — 1 credit per post, paginated. Posts that carry the hashtag. - GET https://api.instadata.dev/v1/instagram/hashtag-reels?query=… — 1 credit per reel, paginated. Reels only (video) that carry the hashtag. - GET https://api.instadata.dev/v1/instagram/keyword-search?query=… — 1 credit per result, paginated. Posts found by Instagram's keyword search, including posts that never used the word as a hashtag. - GET https://api.instadata.dev/v1/instagram/hashtag-stats?query=… — 1 credit per hashtag. Numbers for one hashtag you already know: post count, posts per day and related tags. Returns no posts. - GET https://api.instadata.dev/v1/instagram/hashtag-analytics?query=… — 4 credits per hashtag. Everything hashtag-stats returns for one hashtag, plus its current top posts. - GET https://api.instadata.dev/v1/instagram/hashtag-search?query=… — 1 credit per hashtag, paginated. Finds hashtags matching a keyword, each with its post count and related tags. Returns hashtags, not posts; use hashtag-posts for the posts. - GET https://api.instadata.dev/v1/instagram/profile-search?query=… — 1 credit per profile, paginated - GET https://api.instadata.dev/v1/instagram/location-search?query=… — 1 credit per place, paginated - GET https://api.instadata.dev/v1/instagram/location-stats?query=… — 1 credit per place - GET https://api.instadata.dev/v1/instagram/location-posts?query=… — 1 credit per post, paginated - GET https://api.instadata.dev/v1/instagram/mentions?handle=… — 1 credit per post, paginated. Posts by other accounts that tag or @-mention the profile, in the standard post shape. - GET https://api.instadata.dev/v1/instagram/ads-search?query=… — 3 credits per ad, paginated. Ads in the Meta Ad Library matching a keyword, with the advertiser's Instagram handle when it has one. 3 credits per ad. - GET https://api.instadata.dev/v1/instagram/ads-by-page?query=… — 3 credits per ad, paginated. Ads one advertiser is running, from its Facebook Page URL or Ad Library page URL passed as query. 3 credits per ad. - GET https://api.instadata.dev/v1/instagram/collaborations?handle=… — 3 credits per collaboration, paginated. Paid-partnership posts, reels and stories between a creator and brands, for a creator's or a brand's profile. 3 credits per row. - GET https://api.instadata.dev/v1/instagram/profile-comments?handle=… — 1 credit per comment, paginated. Recent comments across a profile's latest posts, one row per comment with the post it was left on. comments is for one post you already have. ## MCP server - Streamable HTTP at https://mcp.instadata.dev (OAuth 2.1 with PKCE, or `Authorization: Bearer ik_live_...`). - Tools: get_transcript, get_summary, get_post_stats, get_comments, get_profile, get_channel_posts, search_hashtag, download_media, list_endpoints, call_endpoint. `list_endpoints` is free; `call_endpoint` reaches any path above. - Server card: https://instadata.dev/.well-known/mcp/server-card.json - Agent skills: https://instadata.dev/.well-known/agent-skills/index.json (`npx skills add nikhonit/instagram-api-skills`) ## Docs - [Quickstart](https://instadata.dev/docs/quickstart/): From signup to your first record in a few minutes. Get a key, send one GET, read the JSON. - [Authentication](https://instadata.dev/docs/authentication/): One bearer header. Create, name and revoke keys from the dashboard. - [Envelope and errors](https://instadata.dev/docs/envelope-and-errors/): What every response looks like, every error code, and what to retry. - [Pagination and jobs](https://instadata.dev/docs/pagination-and-jobs/): Cursors on every list, and how a request for more than 50 items becomes a job. - [Webhooks](https://instadata.dev/docs/webhooks/): Job completions and account events at your URL, signed with x-instadata-signature. - [Caching and freshness](https://instadata.dev/docs/caching-and-freshness/): The x-cache header, fresh=true, and what each freshness class means. - [Formats and fields](https://instadata.dev/docs/formats-and-fields/): JSON by default, CSV for lists, plain text for transcripts, and a fields parameter that trims any response. - [Rate limits](https://instadata.dev/docs/rate-limits/): Requests per minute by plan, what a 429 looks like, and how to back off. - [MCP server](https://instadata.dev/docs/mcp-server/): Connect Claude, ChatGPT, Cursor or any MCP client to mcp.instadata.dev and every endpoint becomes a tool. - [Machine-readable surfaces](https://instadata.dev/docs/machine-readable/): OpenAPI, llms.txt, the MCP server card and the agent-skills index, for tools that read the API without a human. - [Endpoint reference](https://instadata.dev/endpoints/) - [OpenAPI 3.1](https://instadata.dev/openapi.json) - [Pricing](https://instadata.dev/pricing/) --- # Quickstart From signup to your first record in a few minutes. Get a key, send one GET, read the JSON. ## 1. Get a key [Sign up](/signup) with an email address. The account starts with 25 free credits and no card, and free keys return up to 5 items per list call. Create a key on the [API keys](/app/keys) page; the secret starts with `ik_live_` and is shown once. ## 2. Make a call The profile endpoint is the cheapest way to see the shape of a response: ```bash curl "https://api.instadata.dev/v1/instagram/channel-stats?handle=nasa" \ -H "Authorization: Bearer ik_live_..." ``` From Node: ```js const url = new URL("https://api.instadata.dev/v1/instagram/channel-stats"); url.searchParams.set("handle", "nasa"); const resp = await fetch(url, { headers: { Authorization: "Bearer ik_live_..." } }); const { data, request_id } = await resp.json(); console.log(data.followers, request_id); ``` From Python: ```python import httpx resp = httpx.get( "https://api.instadata.dev/v1/instagram/channel-stats", params={"handle": "nasa"}, headers={"Authorization": "Bearer ik_live_..."}, timeout=120, ) resp.raise_for_status() print(resp.json()["data"]) ``` ## 3. Read the response Every endpoint answers with the same envelope: ```json { "data": { "handle": "nasa", "name": "NASA", "followers": 0, "verified": true, "…": "…" }, "request_id": "req_01J…" } ``` The `X-Credits-Charged` and `X-Credits-Remaining` headers say what the call cost and what is left. Keep `request_id`; quote it in a support email and the call can be traced. ## 4. Pick the next endpoint Every endpoint is `GET /v1/instagram/` with one required parameter: a `url`, a `handle` or a `query`. [The sheet](/endpoints/) lists all of them with their price. Lists take `limit` and `cursor`; every call takes `fresh`, `fields` and `format`. Building an agent instead? Add `https://mcp.instadata.dev` to Claude, ChatGPT or Cursor and skip the key entirely: [MCP server](/docs/mcp-server/). --- # Authentication One bearer header. Create, name and revoke keys from the dashboard. Every request carries an API key in the `Authorization` header: ```bash curl "https://api.instadata.dev/v1/me" \ -H "Authorization: Bearer ik_live_..." ``` Keys start with `ik_live_` and are shown once at creation. Store them in a secrets manager, not in source control. Hold as many keys as you need, one per environment or service; revoking one takes effect within seconds. ## Checking who you are `GET /v1/me` returns the account attached to the key, which is useful in CI to confirm a secret is wired correctly. The response carries the plan, the remaining credits and the request rate. ## Failure modes | Status | Code | Meaning | | --- | --- | --- | | 401 | `missing_api_key` | No `Authorization: Bearer` header | | 401 | `invalid_api_key` | The key is unknown, malformed or revoked | | 402 | `out_of_credits` | The balance does not cover the smallest non-empty result | | 402 | `plan_required` | A free key was refused by an endpoint's per-call minimum; a plan is the fix, not a smaller `limit` | A 401 names the expected prefix in its message. A 402 carries a hint with the billing page. ## Agents The MCP server supports OAuth 2.1 with PKCE, so clients such as Claude and ChatGPT sign in with the account instead of a key. Clients that only take headers can use a key the same way: [MCP server](/docs/mcp-server/). --- # Envelope and errors What every response looks like, every error code, and what to retry. ## The envelope ```json { "data": { "…": "…" }, "meta": { "count": 20, "limit": 20, "next_cursor": "…" }, "request_id": "req_01J…" } ``` `data` is one object, or an array on list endpoints. `meta` appears on lists. `request_id` is on every response, including errors. Two headers travel with every billed response: `X-Credits-Charged` and `X-Credits-Remaining`. `x-cache` says `hit` or `miss`. ## Errors ```json { "error": { "code": "not_found", "message": "reel not found", "hint": "…", "request_id": "req_01J…" } } ``` | Status | Code | When | | --- | --- | --- | | 400 | `invalid_url`, `invalid_handle`, `invalid_query` | Missing or malformed `url`, `handle` or `query` | | 400 | `unsupported_platform_url` | The URL is not an instagram.com URL | | 400 | `invalid_limit` | `limit` is not an integer in range | | 400 | `upstream_spend_ceiling` | The request would exceed the per-request cost ceiling; lower `limit` | | 401 | `missing_api_key`, `invalid_api_key` | No key, or a wrong or revoked one | | 402 | `out_of_credits` | Balance too low for the call | | 402 | `plan_required` | A free key was refused by an endpoint's per-call minimum; the message names the endpoint and the minimum, and a plan is the fix | | 404 | `not_found` | Private, deleted, no transcript, or the URL resolves to nothing | | 409 | `job_not_ready` | Job results requested before the job finished | | 429 | `rate_limited` | Plan requests-per-minute exceeded | | 500 | `internal_error` | Our side; safe to retry | | 502 | `upstream_failure` | Transient fetch failure; safe to retry | | 504 | `upstream_timeout` | The source took too long; safe to retry | Retry `429` and `5xx` with exponential backoff. Do not retry `400`, `401`, `402` or `404`; the request itself needs to change. ```python import httpx, time for attempt in range(5): r = httpx.get(url, headers=headers, timeout=120) if r.status_code == 429 or r.status_code >= 500: time.sleep(2 ** attempt * 2) continue break ``` Failed calls are not charged. Empty results are free up to 25 a day per account; after that an empty result costs one credit. --- # Pagination and jobs Cursors on every list, and how a request for more than 50 items becomes a job. ## Pages List endpoints return a page of items and a `meta` object. When another page exists, `meta.next_cursor` is set: ```bash curl "https://api.instadata.dev/v1/instagram/comments?url=https://www.instagram.com/p/C8xQvZ2sVAb/&limit=50" \ -H "Authorization: Bearer ik_live_..." ``` Pass `meta.next_cursor` back as `cursor` for the next page. No `next_cursor` means the last page. Cursors are opaque and short-lived. ```python params = {"url": post_url, "limit": 50} items = [] while True: r = httpx.get(f"{BASE}/v1/instagram/comments", params=params, headers=H, timeout=120).json() items += r["data"] cursor = r.get("meta", {}).get("next_cursor") if not cursor: break params["cursor"] = cursor ``` Credits are charged per item returned. If the balance cannot cover the whole page, the page is clamped to what it can cover and the `X-Limit-Clamped` header says so. Free keys get at most 5 items a call, and `X-Limit-Capped` says when a request was lowered to that. ## Jobs Synchronous lists stop at `limit=50`. Ask for more and the call becomes a job: ```bash curl "https://api.instadata.dev/v1/instagram/channel-posts?handle=nasa&limit=500" \ -H "Authorization: Bearer ik_live_..." ``` ```json { "data": { "job_id": "job_01J…", "status": "queued", "poll_url": "https://api.instadata.dev/v1/jobs/job_01J…" }, "request_id": "req_01J…" } ``` The response is `202 Accepted`. Poll `GET /v1/jobs/{id}` until `status` is `succeeded` or `failed`; the result carries the items, or a `result_url` for large sets. Credits are charged when results are delivered, per item. Register a [webhook](/docs/webhooks/) for `job.completed` to skip polling. --- # Webhooks Job completions and account events at your URL, signed with x-instadata-signature. Register a webhook on the [Webhooks](/app/webhooks) page or through the API. The response includes a signing secret (`whsec_…`), shown once. ```bash curl -X POST "https://api.instadata.dev/v1/webhooks" \ -H "Authorization: Bearer ik_live_..." \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/hooks/instadata", "events": ["job.completed", "credits.low"]}' ``` ## Events | Event | Fires when | | --- | --- | | `job.completed` | An async job succeeds or fails | | `credits.low` | The balance crosses the low-credit threshold | | `plan.changed` | The subscription is upgraded, downgraded or cancelled | ## Verify the signature Every delivery carries `x-instadata-signature: t=,v1=`: an HMAC-SHA256 of `"{t}.{raw_body}"` with the `whsec_` secret. ```js import crypto from "node:crypto"; export function verify(rawBody, header, secret) { const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("="))); if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex"); return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1)); } ``` Compute the HMAC over the raw request body, before JSON parsing, and reject timestamps older than a few minutes. ## Delivery Deliveries expect a 2xx within 10 seconds; anything else is retried with backoff for up to 24 hours. Events carry an `id`, so treat processing as idempotent. --- # Caching and freshness The x-cache header, fresh=true, and what each freshness class means. Popular content returns in milliseconds because responses are stored for a while. Storage is visible and under your control: - Every response carries `x-cache: hit` or `x-cache: miss`. - A hit costs the same credits as a live read. The difference is latency. - Add `fresh=true` to any call to read live at the same price. ## Freshness classes Each endpoint page names its class. | Class | Behaviour | Typical endpoints | | --- | --- | --- | | Stored once, served forever | Content that never changes | Transcripts, summaries | | Refreshed weekly | Media metadata; the media URLs themselves expire sooner | Download | | Refreshed every 12 hours | Slow-moving profile and tag data | Profile, hashtag stats, places | | Refreshed every 3 hours | Recent-content lists; page 1 refreshes sooner | Profile posts and reels | | Age-aware, 15 minutes to 7 days | Fresher content refreshes faster | Post stats, comments, search | Use `fresh=true` for point-in-time measurements such as end-of-campaign reporting. For dashboards and monitoring, the defaults are almost always the better trade. --- # Formats and fields JSON by default, CSV for lists, plain text for transcripts, and a fields parameter that trims any response. ## format | `format` | Works on | Returns | | --- | --- | --- | | `json` (default) | everything | The `{ data, meta?, request_id }` envelope | | `csv` | list endpoints | Flattened rows, one item per line, UTF-8 | | `text` | transcript endpoints | The plain transcript, no envelope | ```bash curl "https://api.instadata.dev/v1/instagram/comments?url=…&limit=50&format=csv" \ -H "Authorization: Bearer ik_live_..." -o comments.csv ``` Nested objects flatten with underscores (`author.handle` becomes `author_handle`). Credits are identical across formats. ## fields Pass a comma-separated list of paths to keep only those keys: ```bash curl "https://api.instadata.dev/v1/instagram/channel-stats?handle=nasa&fields=handle,followers,bio" \ -H "Authorization: Bearer ik_live_..." ``` - Dot notation reaches nested keys: `author.handle`. - On lists the projection applies to every item. - Unknown fields are ignored, so projections survive schema additions. - `request_id` and `meta` are always included. - Credits are unchanged; projection saves bandwidth and tokens, not billing. --- # Rate limits Requests per minute by plan, what a 429 looks like, and how to back off. Limits are per account, in requests per minute: | Plan | Limit | | --- | --- | | Free | 20 | | Monthly | 200 | | Annual | 300 | Free keys also return at most 5 items per list call, whatever `limit` asks for; when a request was lowered the response carries an `X-Limit-Capped` header (`meta.limit_capped` through the MCP server). Paid plans get the full `limit`. Over the limit you get `429 rate_limited`; the message names the plan and its limit. There is no `Retry-After` header, so back off on your own schedule. Doubling from two seconds over five attempts spans about a minute: ```js async function withBackoff(fn) { for (let attempt = 0; attempt < 5; attempt++) { const resp = await fn(); if (resp.status !== 429) return resp; await new Promise((r) => setTimeout(r, 2 ** attempt * 2000 + Math.random() * 500)); } throw new Error("rate limit retries exhausted"); } ``` Limits count requests, not credits: one list call returning 50 comments is one request. A small pool of concurrent workers beats firing everything at once. Need more? Email [support@instadata.dev](mailto:support@instadata.dev). --- # MCP server Connect Claude, ChatGPT, Cursor or any MCP client to mcp.instadata.dev and every endpoint becomes a tool. `https://mcp.instadata.dev` is a remote MCP server over streamable HTTP. It supports OAuth 2.1 with PKCE, so clients that can sign in need no key, and a bearer key for clients that only take headers. ```json { "mcpServers": { "instadata": { "url": "https://mcp.instadata.dev" } } } ``` In Claude Code: ```bash claude mcp add --transport http instadata https://mcp.instadata.dev ``` With a key instead of OAuth: ```json { "mcpServers": { "instadata": { "url": "https://mcp.instadata.dev", "headers": { "Authorization": "Bearer ik_live_..." } } } } ``` ## Tools The server exposes capability tools for the common reads (profile, posts, transcript, comments, search and so on), plus `list_endpoints`, which is free and calls nothing upstream, and `call_endpoint`, which runs any path on [the sheet](/endpoints/). The live list with descriptions is on the [MCP page](/mcp/) and in the [server card](/.well-known/mcp/server-card.json). Each tool's description carries its parameters, its unit and its price, so a model can pick the right call without reading docs. Tool calls are billed as normal usage from the same balance; failed calls are free. Every call shows up in the dashboard logs with its request id. ## Per-client setup Claude (claude.ai, desktop, Code), ChatGPT developer-mode connectors, Cursor, Windsurf, VS Code, Gemini CLI and the OpenAI Agents SDK are covered on the [MCP page](/mcp/), including one-click installs for Cursor and VS Code. ## Function calling without MCP Any endpoint wraps as a tool in a few lines: ```python def instagram_profile(handle: str) -> dict: """Public profile for an Instagram handle: followers, bio, links, verification.""" r = httpx.get("https://api.instadata.dev/v1/instagram/channel-stats", params={"handle": handle}, headers={"Authorization": f"Bearer {KEY}"}, timeout=120) r.raise_for_status() return r.json()["data"] ``` Use `format=text` on transcripts headed into a prompt and `fields=` to keep tool results small. --- # Machine-readable surfaces OpenAPI, llms.txt, the MCP server card and the agent-skills index, for tools that read the API without a human. | Surface | URL | | --- | --- | | OpenAPI 3.1 | [/openapi.json](/openapi.json) | | llms.txt | [/llms.txt](/llms.txt) | | llms-full.txt (docs and reference in one file) | [/llms-full.txt](/llms-full.txt) | | MCP server card | [/.well-known/mcp/server-card.json](/.well-known/mcp/server-card.json) | | Agent skills index | [/.well-known/agent-skills/index.json](/.well-known/agent-skills/index.json) | | API catalog (RFC 9727 linkset) | [/.well-known/api-catalog](/.well-known/api-catalog) | | OAuth protected-resource metadata | [mcp.instadata.dev/.well-known/oauth-protected-resource](https://mcp.instadata.dev/.well-known/oauth-protected-resource) | | Health | [api.instadata.dev/healthz](https://api.instadata.dev/healthz) | All of them are generated from the same registry the API runs on, so an endpoint appears here the day it serves and not before. Every HTML page also links them with `rel` attributes (`service-desc`, `mcp-server`, `agent-skills`, `service-meta`), and `robots.txt` welcomes AI crawlers. --- # Endpoint reference ## GET /v1/instagram/transcript Parameter: `url` (required), `fresh`, `fields`, `format`. Price: 1 credit + 20 per started minute. Freshness class: immutable. Spoken words of a public reel or video post as plain text. 1 credit for the reel plus 20 per started minute of video. ```bash curl "https://api.instadata.dev/v1/instagram/transcript?url=https://www.instagram.com/reel/C8xQvZ2sVAb/" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/summary Parameter: `url` (required), `fresh`, `fields`, `format`. Price: 4 credit + 20 per started minute. Freshness class: immutable. Short summary and key points of a public reel or video post, built on the same per-minute transcript. 4 credits plus 20 per started minute of video. ```bash curl "https://api.instadata.dev/v1/instagram/summary?url=https://www.instagram.com/reel/C8xQvZ2sVAb/" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/stats Parameter: `url` (required), `fresh`, `fields`, `format`. Price: 1 credit per post. Freshness class: fast. ```bash curl "https://api.instadata.dev/v1/instagram/stats?url=https://www.instagram.com/reel/C8xQvZ2sVAb/" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/comments Parameter: `url` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per comment. Freshness class: fast. ```bash curl "https://api.instadata.dev/v1/instagram/comments?url=https://www.instagram.com/reel/C8xQvZ2sVAb/" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/channel-stats Parameter: `handle` (required), `fresh`, `fields`, `format`. Price: 1 credit per profile. Freshness class: slow. ```bash curl "https://api.instadata.dev/v1/instagram/channel-stats?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/channel-posts Parameter: `handle` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per post. Freshness class: medium. ```bash curl "https://api.instadata.dev/v1/instagram/channel-posts?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/channel-reels Parameter: `handle` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per reel. Freshness class: medium. ```bash curl "https://api.instadata.dev/v1/instagram/channel-reels?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/reels-search Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per result. Freshness class: fast. ```bash curl "https://api.instadata.dev/v1/instagram/reels-search?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/download Parameter: `url` (required), `fresh`, `fields`, `format`. Price: 8 credits per video. Freshness class: near immutable. ```bash curl "https://api.instadata.dev/v1/instagram/download?url=https://www.instagram.com/reel/C8xQvZ2sVAb/" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/profile-full Parameter: `handle` (required), `fresh`, `fields`, `format`. Price: 1 credit per profile. Freshness class: slow. ```bash curl "https://api.instadata.dev/v1/instagram/profile-full?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/profile-about Parameter: `handle` (required), `fresh`, `fields`, `format`. Price: 4 credits per profile. Freshness class: near immutable. ```bash curl "https://api.instadata.dev/v1/instagram/profile-about?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/similar Parameter: `handle` (required), `fresh`, `fields`, `format`. Price: 1 credit per profile. Freshness class: slow. ```bash curl "https://api.instadata.dev/v1/instagram/similar?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/tagged Parameter: `handle` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per post. Freshness class: medium. ```bash curl "https://api.instadata.dev/v1/instagram/tagged?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/hashtag-posts Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per post. Freshness class: fast. Posts that carry the hashtag. ```bash curl "https://api.instadata.dev/v1/instagram/hashtag-posts?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/hashtag-reels Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per reel. Freshness class: fast. Reels only (video) that carry the hashtag. ```bash curl "https://api.instadata.dev/v1/instagram/hashtag-reels?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/keyword-search Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per result. Freshness class: fast. Posts found by Instagram's keyword search, including posts that never used the word as a hashtag. ```bash curl "https://api.instadata.dev/v1/instagram/keyword-search?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/hashtag-stats Parameter: `query` (required), `fresh`, `fields`, `format`. Price: 1 credit per hashtag. Freshness class: slow. Numbers for one hashtag you already know: post count, posts per day and related tags. Returns no posts. ```bash curl "https://api.instadata.dev/v1/instagram/hashtag-stats?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/hashtag-analytics Parameter: `query` (required), `fresh`, `fields`, `format`. Price: 4 credits per hashtag. Freshness class: slow. Everything hashtag-stats returns for one hashtag, plus its current top posts. ```bash curl "https://api.instadata.dev/v1/instagram/hashtag-analytics?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/hashtag-search Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per hashtag. Freshness class: slow. Finds hashtags matching a keyword, each with its post count and related tags. Returns hashtags, not posts; use hashtag-posts for the posts. ```bash curl "https://api.instadata.dev/v1/instagram/hashtag-search?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/profile-search Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per profile. Freshness class: medium. ```bash curl "https://api.instadata.dev/v1/instagram/profile-search?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/location-search Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per place. Freshness class: slow. ```bash curl "https://api.instadata.dev/v1/instagram/location-search?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/location-stats Parameter: `query` (required), `fresh`, `fields`, `format`. Price: 1 credit per place. Freshness class: slow. ```bash curl "https://api.instadata.dev/v1/instagram/location-stats?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/location-posts Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per post. Freshness class: fast. ```bash curl "https://api.instadata.dev/v1/instagram/location-posts?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/mentions Parameter: `handle` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per post. Freshness class: medium. Posts by other accounts that tag or @-mention the profile, in the standard post shape. ```bash curl "https://api.instadata.dev/v1/instagram/mentions?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/ads-search Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 3 credits per ad. Freshness class: medium. Ads in the Meta Ad Library matching a keyword, with the advertiser's Instagram handle when it has one. 3 credits per ad. ```bash curl "https://api.instadata.dev/v1/instagram/ads-search?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/ads-by-page Parameter: `query` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 3 credits per ad. Freshness class: medium. Ads one advertiser is running, from its Facebook Page URL or Ad Library page URL passed as query. 3 credits per ad. ```bash curl "https://api.instadata.dev/v1/instagram/ads-by-page?query=…" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/collaborations Parameter: `handle` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 3 credits per collaboration. Freshness class: slow. Paid-partnership posts, reels and stories between a creator and brands, for a creator's or a brand's profile. 3 credits per row. ```bash curl "https://api.instadata.dev/v1/instagram/collaborations?handle=nasa" -H "Authorization: Bearer ik_live_..." ``` ## GET /v1/instagram/profile-comments Parameter: `handle` (required), `limit`, `cursor`, `fresh`, `fields`, `format`. Price: 1 credit per comment. Freshness class: fast. Recent comments across a profile's latest posts, one row per comment with the post it was left on. comments is for one post you already have. ```bash curl "https://api.instadata.dev/v1/instagram/profile-comments?handle=nasa" -H "Authorization: Bearer ik_live_..." ```