Instagram profile posts API
Read recent public posts from a known Instagram profile feed for content research or a bounded monitoring job. Choose a small result limit before collecting a larger dataset.
Make a request
GET /instagram/channel-posts accepts query parameters. POST /instagram/channel-posts accepts the same inputs as JSON. Send your project key in the x-access-key header; keep it on your server.
Credits: 1 credit per 20 returned items, minimum 1. Your available balance must cover the requested limit before processing.
curl request example
curl --fail-with-body --get 'https://api.fetchfox.net/instagram/channel-posts' \
-H 'x-access-key: YOUR_KEY' \
--data-urlencode 'url=https://www.instagram.com/example_creator/' \
--data-urlencode 'limit=20'JavaScript request example
// Run on your server with FETCHFOX_API_KEY set.
const url = new URL('https://api.fetchfox.net/instagram/channel-posts');
url.searchParams.set('url', 'https://www.instagram.com/example_creator/');
url.searchParams.set('limit', '20');
const response = await fetch(url, {
headers: { 'x-access-key': process.env.FETCHFOX_API_KEY },
signal: AbortSignal.timeout(130000)
});
if (!response.ok) throw new Error('HTTP ' + response.status);
const result = await response.json();
if (!result.success) throw new Error('Request unsuccessful');
console.log(result.data);Python request example
import json, os
from urllib.parse import urlencode
from urllib.request import Request, urlopen
query = urlencode({"url":"https://www.instagram.com/example_creator/","limit":20})
request = Request('https://api.fetchfox.net/instagram/channel-posts?' + query,
headers={'x-access-key': os.environ['FETCHFOX_API_KEY']})
with urlopen(request, timeout=130) as response:
result = json.load(response)
if not result.get('success'):
raise RuntimeError('Request unsuccessful')
print(result['data'])Replace placeholder source IDs with real public URLs. See limits and retries before automating calls.
Choose a bounded result limit
The required url is an Instagram profile URL. Optional limit requests the maximum number of results, not a guaranteed number. Access restrictions or fewer source posts can produce a smaller result set.
This operation does not accept a cursor input. Do not build a loop that assumes each repeated request advances to another page. It is a recent-feed snapshot, not a complete historical archive.
Compare content without double counting
Unavailable views, plays and duration are null. A source-reported zero count remains zero; do not treat null as a measured value.
Persist each item’s returned identifier or canonical URL with your retrieval time. Deduplicate across scheduled runs before calculating posting frequency. Preserve a separate observation record if you need to track metric changes for the same post.
Choose posts or reels
Use this endpoint for the profile feed. Use the separate reels endpoint for the profile’s reels tab. For a deeper read of one known post, use the post metrics endpoint; neither list operation exports comment text.