Changelog

What changed in the IGAPI Instagram API and on this site, newest first. Is it working right now? See the status page.

2.2.0

A new look, a status page, this changelog, a form to request an API key, and a lifetime limit for plans.

Added

  • A status page (/status): whether the API is up, the uptime of the last 30 days, the average response time and the last incident. It works without JavaScript and refreshes itself once a minute.
  • GET /api/health has new fields after the existing ones: state, uptime30d, uptimeSince, avgLatencyMs, lastIncident and updatedAt. The existing fields are unchanged.
  • This changelog (/changelog): what changed in each release.
  • A “Request an API key” form on the home page, /pricing and /docs: your e-mail, the plan and what you will use it for. We answer within 24 hours.
  • A support e-mail address in the footer of every page, with links to the status page and this changelog.
  • A fourth plan limit next to per minute, per day and per month: requests in total per key, which never resets. Past it the answer is 429 plan_limit_exceeded with "window": "total".

Changed

  • The Free plan is 1,000 requests in total per key (once, not every month), to try every endpoint before you buy. The Mega plan allows 350 requests a minute.
  • One design for the whole site: the IBM Plex Sans font served by the site itself, 16 px body text, and the same colours and buttons on every page in the dark and the light theme.
  • The header reads API · Docs · Pricing · Free tools. The Instagram viewer and the six downloaders are under Free tools; on phones the menu starts with the developer links.
  • The Buy and “Get a free key” buttons open the request form with their plan chosen. The Telegram link is still there, under the form.

Fixed

  • Text that was too faint, mostly in the light theme: every text now has a contrast of at least 4.5:1 (3:1 for large text, field edges and focus rings) in both themes.
  • A visible focus ring on every link, button and field when you use the keyboard.

2.1.1

One header and footer for the whole site, a tab bar for the downloaders, and a clear rule for requests without an API key.

Added

  • One header, phone menu and footer on every public page: the API, the docs, pricing and the free tools are always in the same place.
  • A tab bar above the box on the six downloader pages and the Instagram viewer, to switch between video, reels, story, highlights, photo and profile picture.
  • The Instagram viewer (/tools.html) links all six downloaders and answers the most common questions.
  • A rule for requests without an API key, shown on /docs and /pricing: answered as before, limited per IP address to the Trial plan’s limits, or refused with 401 api_key_required.

Changed

  • A request answered 503 no_sessions (no Instagram account of ours was free at that moment) is no longer counted against your plan.
  • The site’s own lookup tools use a short-lived session cookie instead of an API key; the Legal page explains it.
  • Error answers of /api/proxy-image and /api/download now include a message field. The other fields are unchanged.
  • A page address with a trailing slash or capital letters redirects (301) to its one canonical address.
  • Clearer page titles and headings, and texts that speak as “we”.

Fixed

  • The phone menu keeps the keyboard focus inside while it is open and the page behind it cannot be reached.
  • Small layout fixes on phones: placeholders at 360 px wide and the end of the docs sidebar.

2.1.0

Pricing, the plans endpoint, six downloader pages, a new name and logo, and faster pages.

Added

  • GET /api/plans: the public plans with their limits and prices. No key needed, not counted.
  • A pricing page (/pricing) with the plans, their limits and how to get a key.
  • Six downloader pages (video, reels, photo and carousel, story, highlights, profile picture) and a Legal page with the terms, privacy and removal requests.
  • One smart box on the tools: paste a username or any Instagram link (post, reel, story, highlight or profile).
  • Maintenance mode: the data endpoints answer 503 maintenance with Retry-After: 300, and /api/health shows "maintenance": true.
  • Cross-origin requests (CORS) from listed web sites, off by default.
  • A new logo, icons and link preview image.
  • Search-ready pages: canonical addresses, link previews, structured data, robots.txt and sitemap.xml.

Changed

  • The main address is https://igapi.online. The previous address keeps answering every /api/* request, without a redirect.
  • Fonts are served by the site itself and the styles load with the page, so pages appear faster, most of all on phones.
  • The product is called IGAPI everywhere.

Fixed

  • Every input error answered 400 is free: a malformed max_id is now refused before your key is charged.
  • X-API-Key-Status is on every data-endpoint answer to a request that sent a key, also on a 400 or the maintenance 503.
  • Usernames made only of dots, or with two dots in a row, are refused with 400 invalid_username before Instagram is asked.
  • A real 404 page, and .html addresses redirect to the clean one.
  • An Instagram highlight share link (instagram.com/s/…) opens that highlight.
  • A strict Content-Security-Policy on every public page.

2.0.0

API keys with plans and limits, a download endpoint, and full API documentation.

Added

  • Plans for API keys: limits per minute, per day and per month (UTC). Past a limit the answer is 429 plan_limit_exceeded with the plan, the window, retryAfterMs, resetAt and Retry-After.
  • A Trial plan with 50 requests a day.
  • GET /api/download: saves an Instagram photo or video as a file, with a clean file name.
  • The X-API-Key-Status response header, and GET /api/health with your key to check it without spending a request.
  • posts_viewable and stories_viewable in /api/userinfo.
  • Stories and highlights in the lookup tools, a download button on every item, and “Download all”.
  • API documentation at /docs: every endpoint with examples, the error codes and a live playground.

Changed

  • An unknown or revoked key is served like a request without a key, with X-API-Key-Status: invalid.
  • A username longer than 30 characters or a malformed link is refused with 400 before any request is spent.
  • An unknown /api/ path answers JSON (404).
  • When one of our own Instagram accounts fails, the answer is 503, never 401 or 403 (those are about your key or a private profile).

Fixed

  • An expired Instagram media link in /api/download answers Link expired (403, 404 or 410) so you know to fetch the post again; other upstream errors answer 502.
  • Downloads report which files failed.
  • More stable under sustained load: memory use no longer grows with every request.