<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>GetSocialAPI Blog</title>
        <link>https://getsocialapi.com/blog/</link>
        <description>GetSocialAPI Blog</description>
        <lastBuildDate>Fri, 30 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 GetSocialAPI</copyright>
        <item>
            <title><![CDATA[Rate limits, retries and idempotent pagination: an engineering guide]]></title>
            <link>https://getsocialapi.com/blog/api-rate-limits-retries/</link>
            <guid>https://getsocialapi.com/blog/api-rate-limits-retries/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to build collection pipelines that survive 429s and 503s — backoff, Retry-After, cursor checkpointing and the billing model behind it.]]></description>
            <content:encoded><![CDATA[<p>API clients fail in production for one of two reasons: they ignore
rate limits, or they retry the wrong things. This guide is the
playbook we give every integrator of <a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a> —
it generalizes to any cursor-paginated API.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-three-numbers-that-govern-your-throughput">The three numbers that govern your throughput<a href="https://getsocialapi.com/blog/api-rate-limits-retries/#the-three-numbers-that-govern-your-throughput" class="hash-link" aria-label="Direct link to The three numbers that govern your throughput" title="Direct link to The three numbers that govern your throughput" translate="no">​</a></h2>
<ol>
<li class=""><strong>Plan RPS</strong> — requests per second allowed by your plan. Exceed it
and the gateway answers <code>429</code> with <code>Retry-After: 1</code>. It is a <em>soft</em>
wall: sleep and continue; nothing is lost, nothing is billed.</li>
<li class=""><strong>Upstream timeout budget</strong> — the gateway allows up to 25 s per
upstream call and returns <code>503</code> + <code>Retry-After: 2</code> when exceeded.
Large pages (a ~100-post timeline) legitimately take seconds; don't
set client timeouts below 30.</li>
<li class=""><strong>Monthly request quota</strong> — billed only on <code>200</code> and <code>404</code>. Errors
and timeouts cost nothing by design, so <em>retrying is always
financially safe</em>.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-retry-table">The retry table<a href="https://getsocialapi.com/blog/api-rate-limits-retries/#the-retry-table" class="hash-link" aria-label="Direct link to The retry table" title="Direct link to The retry table" translate="no">​</a></h2>
<table><thead><tr><th>Condition</th><th>Retry?</th><th>Strategy</th></tr></thead><tbody><tr><td><code>429</code></td><td>yes</td><td>sleep <code>Retry-After</code>, same request</td></tr><tr><td><code>503</code></td><td>yes</td><td>sleep <code>Retry-After</code>, same request</td></tr><tr><td><code>5xx</code> other</td><td>yes</td><td>exponential backoff, cap 3 attempts</td></tr><tr><td><code>400 Invalid Cursor</code></td><td><strong>no</strong></td><td>fix caller — cursor was mangled</td></tr><tr><td><code>404</code></td><td>no</td><td>entity gone; log and skip</td></tr></tbody></table>
<p>The 400-is-not-retryable rule matters most: a broken cursor is
deterministic, and retrying it burns latency for the same answer.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="idempotent-pagination-checkpoint-everything">Idempotent pagination: checkpoint everything<a href="https://getsocialapi.com/blog/api-rate-limits-retries/#idempotent-pagination-checkpoint-everything" class="hash-link" aria-label="Direct link to Idempotent pagination: checkpoint everything" title="Direct link to Idempotent pagination: checkpoint everything" translate="no">​</a></h2>
<p>A cursor is a pure function argument — same cursor, same page. That
makes checkpointing trivial and resumption exact:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> time</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ServiceUnavailable</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">CKPT </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"followers_cursor.txt"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">open</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">CKPT</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">read</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">exists</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">CKPT</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rows </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">try</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"25025320"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> max_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">except</span><span class="token plain"> ServiceUnavailable </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">retry_after </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    rows </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"users"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"next_max_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">open</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">CKPT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"w"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cursor </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> cursor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><br></div></code></pre></div></div>
<p>Kill it anywhere — the process resumes from the checkpoint with zero
duplicate requests. For million-item exports this is not an
optimization; it is the only way to finish.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="politeness-that-pays">Politeness that pays<a href="https://getsocialapi.com/blog/api-rate-limits-retries/#politeness-that-pays" class="hash-link" aria-label="Direct link to Politeness that pays" title="Direct link to Politeness that pays" translate="no">​</a></h2>
<ul>
<li class=""><strong>Honor Retry-After verbatim</strong> — it reflects actual capacity, not
punishment.</li>
<li class=""><strong>Jitter your bursts</strong> — RPS limits are per-second buckets; even
spacing beats bursts of exactly-N.</li>
<li class=""><strong>Cache resolution results</strong> — username → pk lookups are stable;
re-resolving per request wastes budget.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="observability-three-metrics-that-predict-incidents">Observability: three metrics that predict incidents<a href="https://getsocialapi.com/blog/api-rate-limits-retries/#observability-three-metrics-that-predict-incidents" class="hash-link" aria-label="Direct link to Observability: three metrics that predict incidents" title="Direct link to Observability: three metrics that predict incidents" translate="no">​</a></h2>
<ol>
<li class=""><code>429</code> rate — your client is outpacing the plan; fix pacing.</li>
<li class=""><code>503</code> rate — upstream pressure; widen per-page timing, reduce
<code>count</code>.</li>
<li class="">Pages-per-cursor progress — a stalled cursor with no errors means
an endpoint contract change; alert on it.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-billing-asymmetry-restated">The billing asymmetry, restated<a href="https://getsocialapi.com/blog/api-rate-limits-retries/#the-billing-asymmetry-restated" class="hash-link" aria-label="Direct link to The billing asymmetry, restated" title="Direct link to The billing asymmetry, restated" translate="no">​</a></h2>
<p>Only 200/404 bill. Every retry mechanic above is free. The correct
posture is therefore aggressive about <em>retrying transient states</em> and
strict about <em>not retrying deterministic ones</em> — the exact opposite of
DOM-scraping instincts.</p>
<p>Build it once, sleep at night — <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">100 free calls</a>
to pressure-test your loop.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/api-rate-limits-retries/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> and <a href="https://getsocialapi.com/facebook-api/" target="_blank" rel="noopener noreferrer" class="">Facebook API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>engineering</category>
            <category>Pagination</category>
            <category>reliability</category>
        </item>
        <item>
            <title><![CDATA[Detecting fake Instagram engagement with API data]]></title>
            <link>https://getsocialapi.com/blog/detecting-fake-instagram-engagement/</link>
            <guid>https://getsocialapi.com/blog/detecting-fake-instagram-engagement/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical fraud checklist using only API-observable signals — liker composition, follower quality, comment patterns and about-account flags.]]></description>
            <content:encoded><![CDATA[<p>Every influencer deal, marketplace onboarding and UGC campaign
eventually asks: is this engagement real? No single metric proves it —
but a short battery of API checks catches most purchased engagement,
because fakes are cheap and APIs see the seams. This is the checklist,
endpoint by endpoint.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="signal-1-liker-composition">Signal 1: liker composition<a href="https://getsocialapi.com/blog/detecting-fake-instagram-engagement/#signal-1-liker-composition" class="hash-link" aria-label="Direct link to Signal 1: liker composition" title="Direct link to Signal 1: liker composition" translate="no">​</a></h2>
<p>The <a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_likes/">likes endpoint</a> returns a
~100-liker sample. Fake likers cluster into recognizable shapes:</p>
<ul>
<li class="">high share of faceless accounts: default avatar, no posts, private</li>
<li class="">follower counts bunched at round numbers (100, 500, 1000)</li>
<li class="">usernames with digit-suffix patterns</li>
</ul>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">likers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">media_likers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shortcode</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"users"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">faceless </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> u </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> likers</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> u</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"is_private"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> u</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"profile_pic_url"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"faceless share:"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> faceless </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">likers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>A healthy public post's likers are mostly public, avatar-bearing
accounts. A &gt;40% faceless share on a "lifestyle" account is a
conversation, not a coincidence.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="signal-2-engagement-ratio-sanity">Signal 2: engagement ratio sanity<a href="https://getsocialapi.com/blog/detecting-fake-instagram-engagement/#signal-2-engagement-ratio-sanity" class="hash-link" aria-label="Direct link to Signal 2: engagement ratio sanity" title="Direct link to Signal 2: engagement ratio sanity" translate="no">​</a></h2>
<p>Cross the <a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_info/">media card</a> counters
with the <a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_info_by_id/">profile</a>:</p>
<ul>
<li class="">like-to-follower ratio far above the account's historical baseline
on isolated posts (bought bursts concentrate on few posts)</li>
<li class="">comment-to-like ratio below ~0.5% with high likes (comments cost
more than likes — purchased packages reflect that)</li>
</ul>
<p>Compute the baseline from the account's own grid via
<a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_media/">user media</a> — you need ~12 posts
for a stable median.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="signal-3-comment-content-patterns">Signal 3: comment content patterns<a href="https://getsocialapi.com/blog/detecting-fake-instagram-engagement/#signal-3-comment-content-patterns" class="hash-link" aria-label="Direct link to Signal 3: comment content patterns" title="Direct link to Signal 3: comment content patterns" translate="no">​</a></h2>
<p>Full comment export is one walker (see the
<a class="" href="https://getsocialapi.com/blog/instagram-comments-api-pagination/">comments pagination guide</a>).
Fraud tells:</p>
<ul>
<li class="">emoji-only / generic praise ("🔥🔥", "Great post!") share</li>
<li class="">duplicated texts across different commenter accounts</li>
<li class="">commenters whose own accounts are empty</li>
<li class="">declared <code>comment_count</code> far above collectable + child comments —
the gap is where filtered spam lived</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="signal-4-the-about-screen">Signal 4: the About screen<a href="https://getsocialapi.com/blog/detecting-fake-instagram-engagement/#signal-4-the-about-screen" class="hash-link" aria-label="Direct link to Signal 4: the About screen" title="Direct link to Signal 4: the About screen" translate="no">​</a></h2>
<p>The <a class="" href="https://getsocialapi.com/docs/api/instagram/user/about/">about-this-account endpoint</a>
adds the trust trio:</p>
<ul>
<li class="">recent <code>joined_at</code> on an account claiming brand history</li>
<li class="">multiple <code>former_usernames</code> — repurposed handle</li>
<li class=""><code>accounts_with_shared_followers</code> clustering — bot farms share
audiences by construction</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="scoring-it">Scoring it<a href="https://getsocialapi.com/blog/detecting-fake-instagram-engagement/#scoring-it" class="hash-link" aria-label="Direct link to Scoring it" title="Direct link to Scoring it" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">score </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">score </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> faceless_share </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.4</span><span class="token plain">           </span><span class="token comment" style="color:#999988;font-style:italic"># liker quality</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">score </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> er_outlier </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">                 </span><span class="token comment" style="color:#999988;font-style:italic"># burst detection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">score </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> generic_comment_share </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.6</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># comment quality</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">score </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> joined_recently                </span><span class="token comment" style="color:#999988;font-style:italic"># account age</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 0-1: normal variance; 2: review; 3-4: high fraud probability</span><br></div></code></pre></div></div>
<p>The whole battery is ~20 API calls per account — profile, about,
media page, one likes sample, one comments page. At influencer-vetting
volume it costs less than one disputed invoice.</p>
<p>Every signal here is observable through public endpoints, no cookies,
no account access — <a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a>,
first 100 calls free.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/detecting-fake-instagram-engagement/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>trust-safety</category>
            <category>fraud</category>
        </item>
        <item>
            <title><![CDATA[Facebook feed API: user timeline and group posts in one endpoint]]></title>
            <link>https://getsocialapi.com/blog/facebook-feed-api/</link>
            <guid>https://getsocialapi.com/blog/facebook-feed-api/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The unified Facebook feed endpoint — per_page sizing, the after cursor, and why group pages duplicate up to two posts at the seam.]]></description>
            <content:encoded><![CDATA[<p>Most feed integrations want the same thing: a stream of posts, in small
pages, from either a profile or a group — without wiring two different
pipelines. The <a class="" href="https://getsocialapi.com/docs/api/facebook/feed/">unified feed endpoint</a> does
exactly that: one route, two targets.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="one-call-two-targets">One call, two targets<a href="https://getsocialapi.com/blog/facebook-feed-api/#one-call-two-targets" class="hash-link" aria-label="Direct link to One call, two targets" title="Direct link to One call, two targets" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /fb/api/v1/feed?user_id=&lt;id&gt;                # profile timeline</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">GET /fb/api/v1/feed?group_id=&lt;id&gt;&amp;per_page=10   # group feed</span><br></div></code></pre></div></div>
<p>Pass exactly one of <code>user_id</code> / <code>group_id</code>. Page size is <code>per_page</code>
(integer 3–20, default 10), and the cursor comes from
<code>page_info.end_cursor</code> of each page.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-two-pagination-behaviors">The two pagination behaviors<a href="https://getsocialapi.com/blog/facebook-feed-api/#the-two-pagination-behaviors" class="hash-link" aria-label="Direct link to The two pagination behaviors" title="Direct link to The two pagination behaviors" translate="no">​</a></h2>
<p><strong>Profile timelines</strong> ask Facebook for exactly <code>per_page</code> posts. Two
honest quirks:</p>
<ul>
<li class="">Facebook sometimes returns a post or two <em>more</em> than requested. The
service does not trim the response — trimming would silently lose
posts at page seams, and per-page cursors do not exist upstream.</li>
<li class="">Loop on <code>has_next_page</code>, not on counting posts.</li>
</ul>
<p><strong>Group feeds</strong> are different: Facebook hard-caps its native page at
roughly two posts. The service stitches several native pages up to
<code>per_page</code> — which means up to <strong>two duplicate edges can appear at a
seam</strong>. Deduplicate by <code>node.cache_id</code>.</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi_facebook </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">facebook</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> seen </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">feed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"100053723115450"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> per_page</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> after</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    conn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"data"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"profile"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"timeline_feed_units"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> e </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"edges"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        node </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"node"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"cache_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> seen</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            seen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"cache_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            posts</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"page_info"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"has_next_page"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"page_info"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"end_cursor"</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p>The same walker works for a group — the connection just lives at
<code>data.group_address.group_feed</code> instead.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="example-observations">Example observations<a href="https://getsocialapi.com/blog/facebook-feed-api/#example-observations" class="hash-link" aria-label="Direct link to Example observations" title="Direct link to Example observations" translate="no">​</a></h2>
<p>The figures below are illustrative observations, not a reproducible benchmark or a performance guarantee. Response sizes, latency and coverage depend on the target and upstream availability. Before sizing a production export, record the date, endpoint, parameters, page count and deduplicated item count for your own test.</p>
<table><thead><tr><th>Target</th><th>Latency</th><th>Page</th><th>Seam quality</th></tr></thead><tbody><tr><td>Profile page 1</td><td>~2.5 s</td><td>exactly 10 posts + cursor</td><td>—</td></tr><tr><td>Profile page 2</td><td>~2.5 s</td><td>10 posts</td><td>0 duplicates, 0 lost</td></tr><tr><td>Group, per_page=10</td><td>~9 s</td><td>10 Story posts</td><td>≤2 dupes, dedupe by cache_id</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="errors-worth-handling">Errors worth handling<a href="https://getsocialapi.com/blog/facebook-feed-api/#errors-worth-handling" class="hash-link" aria-label="Direct link to Errors worth handling" title="Direct link to Errors worth handling" translate="no">​</a></h2>
<p>A broken or foreign cursor returns <strong>400 Invalid Cursor</strong> — restart
from page 1 instead of retrying. Timeouts come back as 503 with
<code>Retry-After: 2</code>; cursors are session-independent, so a retry of the
<em>same</em> request after a timeout is always safe.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="when-to-use-which-endpoint">When to use which endpoint<a href="https://getsocialapi.com/blog/facebook-feed-api/#when-to-use-which-endpoint" class="hash-link" aria-label="Direct link to When to use which endpoint" title="Direct link to When to use which endpoint" translate="no">​</a></h2>
<ul>
<li class=""><code>feed</code> — dashboards, monitoring, "latest N posts" widgets. Small
pages, low latency, one code path for both targets.</li>
<li class=""><code>posts</code> — bulk export of a full timeline. Pages of ~100 posts per
request, fixed by the service.</li>
<li class=""><code>group_posts</code> — group-only pipelines that want the raw native
behavior without stitching.</li>
</ul>
<p>All three share the same cursor protocol, so switching between them is
a base-URL change, not a rewrite. Start with 100 free calls on
<a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/facebook-feed-api/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/facebook-api/" target="_blank" rel="noopener noreferrer" class="">Facebook API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Facebook</category>
            <category>feed</category>
            <category>Pagination</category>
        </item>
        <item>
            <title><![CDATA[Facebook friends, followers and followings: what each list actually means]]></title>
            <link>https://getsocialapi.com/blog/facebook-friends-vs-followers/</link>
            <guid>https://getsocialapi.com/blog/facebook-friends-vs-followers/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The three Facebook connection lists are different signals — which endpoint to call for which question, and how to paginate each.]]></description>
            <content:encoded><![CDATA[<p>Facebook exposes three distinct connection lists, and product teams
routinely conflate them. They answer different questions, they are
built differently, and mixing them up poisons every metric built on
top. Here is the disambiguation, with the endpoint for each.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-three-lists">The three lists<a href="https://getsocialapi.com/blog/facebook-friends-vs-followers/#the-three-lists" class="hash-link" aria-label="Direct link to The three lists" title="Direct link to The three lists" translate="no">​</a></h2>
<table><thead><tr><th>List</th><th>Question it answers</th><th>Visibility</th></tr></thead><tbody><tr><td><strong>Friends</strong></td><td>who accepted a mutual connection</td><td>usually private</td></tr><tr><td><strong>Followers</strong></td><td>who subscribes to this profile's public posts</td><td>public for pages/public profiles</td></tr><tr><td><strong>Followings</strong></td><td>whom this profile subscribes to</td><td>public for pages/public profiles</td></tr></tbody></table>
<p>Friends are bidirectional and require acceptance — a strong-tie
signal. Following is one-directional and free — a weak-tie interest
signal. A brand cannot have "friends" at all; it has followers, and it
follows other accounts.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-endpoints">The endpoints<a href="https://getsocialapi.com/blog/facebook-friends-vs-followers/#the-endpoints" class="hash-link" aria-label="Direct link to The endpoints" title="Direct link to The endpoints" translate="no">​</a></h2>
<p>All three live under the same contract — pages of <strong>15</strong>, cursor from
<code>page_info.end_cursor</code>, passed back as <code>after</code>:</p>
<ul>
<li class=""><a class="" href="https://getsocialapi.com/docs/api/facebook/friends/">Friends</a> — <code>GET /fb/api/v1/friends</code></li>
<li class=""><a class="" href="https://getsocialapi.com/docs/api/facebook/followers/">Followers</a> — <code>GET /fb/api/v1/followers</code></li>
<li class=""><a class="" href="https://getsocialapi.com/docs/api/facebook/followings/">Followings</a> — <code>GET /fb/api/v1/followings</code> (supports name filtering via <code>query</code>)</li>
</ul>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi_facebook </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">facebook</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">export</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> uid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    rows</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> after</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        conn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"data"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"profile"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"followers"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># or friends/followings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        rows </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"node"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> e </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"edges"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"page_info"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"has_next_page"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> rows</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"page_info"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"end_cursor"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">followers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> export</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"100053723115450"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>The connection key shifts slightly between endpoints (<code>profile.followers</code>
vs <code>group</code> on group-scoped lists) — the response always mirrors the
documented shape for that route.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="signals-worth-computing">Signals worth computing<a href="https://getsocialapi.com/blog/facebook-friends-vs-followers/#signals-worth-computing" class="hash-link" aria-label="Direct link to Signals worth computing" title="Direct link to Signals worth computing" translate="no">​</a></h2>
<ul>
<li class=""><strong>Follower / following ratio</strong> — the classic influence heuristic.</li>
<li class=""><strong>Audience overlap</strong> — followers ∩ following: the account's actual
community core.</li>
<li class=""><strong>Empty friends on a personal profile</strong> — either privacy settings or
a repurposed account; cross-check with the
<a class="" href="https://getsocialapi.com/docs/api/facebook/overview/">profile overview</a>.</li>
<li class=""><strong>Followings without followers</strong> — a curation-heavy account
(news, aggregation) rather than a social one.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="privacy-boundaries-stated-honestly">Privacy boundaries, stated honestly<a href="https://getsocialapi.com/blog/facebook-friends-vs-followers/#privacy-boundaries-stated-honestly" class="hash-link" aria-label="Direct link to Privacy boundaries, stated honestly" title="Direct link to Privacy boundaries, stated honestly" translate="no">​</a></h2>
<p>Friends lists are frequently hidden by privacy settings even when the
profile itself is public. The API returns an empty connection in that
case — an empty list is data ("hidden"), not a bug. Design pipelines
to distinguish <em>empty-because-hidden</em> from <em>empty-because-none</em> by
checking the profile's privacy flags first.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="takeaway">Takeaway<a href="https://getsocialapi.com/blog/facebook-friends-vs-followers/#takeaway" class="hash-link" aria-label="Direct link to Takeaway" title="Direct link to Takeaway" translate="no">​</a></h2>
<p>Three lists, three endpoints, one cursor protocol. Decide which
question you are actually asking before choosing the route — then the
walk is always the same 10 lines. Try all three on
<a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a> — the first 100 calls are
free.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/facebook-friends-vs-followers/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/facebook-api/" target="_blank" rel="noopener noreferrer" class="">Facebook API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Facebook</category>
            <category>social-graph</category>
        </item>
        <item>
            <title><![CDATA[How to export Facebook group members with pagination]]></title>
            <link>https://getsocialapi.com/blog/facebook-group-members-api/</link>
            <guid>https://getsocialapi.com/blog/facebook-group-members-api/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A complete guide to pulling a full Facebook group member list through an API: page structure, the after cursor, dedup rules and a working Python walker.]]></description>
            <content:encoded><![CDATA[<p>Every Facebook group scraping task eventually hits the same wall: the
member list is paginated in small pages, and naive collection loses
people at the seams. This guide shows the exact protocol we use in
production at <a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">GetSocialAPI</a> — the same one
the <a class="" href="https://getsocialapi.com/docs/api/facebook/members/">group members endpoint</a> implements.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-endpoint">The endpoint<a href="https://getsocialapi.com/blog/facebook-group-members-api/#the-endpoint" class="hash-link" aria-label="Direct link to The endpoint" title="Direct link to The endpoint" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /fb/members/all/{group_id}?after=&lt;cursor&gt;</span><br></div></code></pre></div></div>
<p>One page holds a fixed batch of <strong>15 members</strong> — the size is set by the
upstream and there is no <code>count</code> knob. The response carries three things
you care about:</p>
<ul>
<li class=""><code>data.group.new_member_list.edges[]</code> — member nodes of this page</li>
<li class=""><code>data.group.new_member_list.page_info.end_cursor</code> — the cursor to the next page</li>
<li class=""><code>data.group.new_member_list.page_info.has_next_page</code> — your loop condition</li>
</ul>
<p>To resolve a group from its URL (<code>facebook.com/groups/800246542990860</code>)
use the resolve endpoint first, or pass the numeric id directly.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-walking-loop">The walking loop<a href="https://getsocialapi.com/blog/facebook-group-members-api/#the-walking-loop" class="hash-link" aria-label="Direct link to The walking loop" title="Direct link to The walking loop" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi_facebook </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">facebook</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">members</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">members</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"800246542990860"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> after</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    conn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"data"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"group"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"new_member_list"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    members </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"node"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> e </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"edges"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"page_info"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"has_next_page"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"page_info"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"end_cursor"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">members</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"members exported"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Three rules that make this loop lossless:</p>
<ol>
<li class=""><strong>Pass the cursor verbatim.</strong> <code>end_cursor</code> is a long base64 string;
copy it as-is into <code>after</code>. Never try to decode or slice it — cursors
are opaque and session-independent, but only whole.</li>
<li class=""><strong>Loop on <code>has_next_page</code>, not on counting.</strong> Page size can wobble by
one node at seam boundaries; the flag is the source of truth.</li>
<li class=""><strong>Deduplicate by node id</strong> if you re-run the walk — Facebook
occasionally reshuffles members between pages while you paginate
(joins/leaves happen live).</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="what-a-member-node-looks-like">What a member node looks like<a href="https://getsocialapi.com/blog/facebook-group-members-api/#what-a-member-node-looks-like" class="hash-link" aria-label="Direct link to What a member node looks like" title="Direct link to What a member node looks like" translate="no">​</a></h2>
<p>Each edge carries <code>node.name</code>, <code>node.id</code>, <code>node.profile_picture</code> and —
for searchable lists — a <code>node.subtitle</code> with the city. Business
accounts may include <code>job_history</code> entries.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="errors-that-matter">Errors that matter<a href="https://getsocialapi.com/blog/facebook-group-members-api/#errors-that-matter" class="hash-link" aria-label="Direct link to Errors that matter" title="Direct link to Errors that matter" translate="no">​</a></h2>
<table><thead><tr><th>HTTP</th><th>Meaning</th></tr></thead><tbody><tr><td><code>400 Invalid Cursor</code></td><td>you mangled or reused a cursor from another group — restart from page 1</td></tr><tr><td><code>404</code></td><td>group id does not exist or the group is hidden</td></tr><tr><td><code>429</code></td><td>you exceeded your plan RPS — back off for <code>Retry-After</code> seconds</td></tr></tbody></table>
<p>Failed calls (everything except 200/404) are not billed — a safe
property of the whole <a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">GetSocialAPI</a> billing
model.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="takeaways">Takeaways<a href="https://getsocialapi.com/blog/facebook-group-members-api/#takeaways" class="hash-link" aria-label="Direct link to Takeaways" title="Direct link to Takeaways" translate="no">​</a></h2>
<p>Full group export is a solved problem if you respect the cursor
protocol: fixed pages, <code>has_next_page</code> as the loop condition, verbatim
cursors, dedupe on re-runs. The Python walker above is ~10 lines and
exports groups of any size. Open an account — the first 100 calls are
free — and try it on your own group id.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/facebook-group-members-api/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/facebook-api/" target="_blank" rel="noopener noreferrer" class="">Facebook API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Facebook</category>
            <category>groups</category>
            <category>Pagination</category>
        </item>
        <item>
            <title><![CDATA[Scraping Facebook group posts: Story nodes, reactions, pagination]]></title>
            <link>https://getsocialapi.com/blog/facebook-group-posts-api/</link>
            <guid>https://getsocialapi.com/blog/facebook-group-posts-api/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to pull every post of a Facebook group — Story nodes vs header units, the end_cursor protocol and per-page reality.]]></description>
            <content:encoded><![CDATA[<p>A Facebook group feed is not a flat list of posts. It mixes real posts
with section headers ("New members", "Suggested for you") and
promotions — and a naive collector happily saves the noise as content.
Here is what the <a class="" href="https://getsocialapi.com/docs/api/facebook/group_posts/">group posts endpoint</a>
actually returns and how to walk it.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-endpoint-and-its-shape">The endpoint and its shape<a href="https://getsocialapi.com/blog/facebook-group-posts-api/#the-endpoint-and-its-shape" class="hash-link" aria-label="Direct link to The endpoint and its shape" title="Direct link to The endpoint and its shape" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /fb/api/v1/group_posts/{group_id}?after=&lt;cursor&gt;</span><br></div></code></pre></div></div>
<p>The payload lives at <code>data.group_address.group_feed</code>:</p>
<ul>
<li class=""><code>edges[]</code> — mixed units; filter by <code>node.__typename</code></li>
<li class=""><code>page_info.end_cursor</code> — the cursor (~550 chars, base64)</li>
<li class=""><code>page_info.has_next_page</code> — loop condition</li>
</ul>
<p><strong><code>__typename</code> values that matter:</strong></p>
<table><thead><tr><th>Value</th><th>Meaning</th><th>Action</th></tr></thead><tbody><tr><td><code>Story</code></td><td>an actual post</td><td>keep</td></tr><tr><td><code>GroupsSectionHeaderUnit</code></td><td>section divider</td><td>skip</td></tr><tr><td><code>QuickPromotionNativeTemplateFeedUnit</code></td><td>native promo</td><td>skip</td></tr></tbody></table>
<p>Every <code>Story</code> node carries <code>cache_id</code> (dedupe key), the author,
message text, attachment, reaction and comment counters, and timestamps.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-walker">The walker<a href="https://getsocialapi.com/blog/facebook-group-posts-api/#the-walker" class="hash-link" aria-label="Direct link to The walker" title="Direct link to The walker" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi_facebook </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">facebook</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> seen </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">group_posts</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"800246542990860"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> after</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    feed </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"data"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"group_address"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"group_feed"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> e </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> feed</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"edges"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        n </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"node"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> n</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"__typename"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Story"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> n</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"cache_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> seen</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            seen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">n</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"cache_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            posts</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">n</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> feed</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"page_info"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"has_next_page"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> feed</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"page_info"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"end_cursor"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"posts collected"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="per-page-reality">Per-page reality<a href="https://getsocialapi.com/blog/facebook-group-posts-api/#per-page-reality" class="hash-link" aria-label="Direct link to Per-page reality" title="Direct link to Per-page reality" translate="no">​</a></h2>
<p>Facebook serves its native group page in chunks of <strong>2–3 Story
posts</strong> — that is upstream behavior, not an API limitation. One
request = one chunk; a 100-post group costs ~40 requests. Latency per
page is ~3 seconds. If that cadence does not fit your use case, the
<a class="" href="https://getsocialapi.com/docs/api/facebook/feed/">unified feed endpoint</a> stitches chunks
server-side up to <code>per_page=20</code> at the cost of occasional seam
duplicates.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="cursor-rules">Cursor rules<a href="https://getsocialapi.com/blog/facebook-group-posts-api/#cursor-rules" class="hash-link" aria-label="Direct link to Cursor rules" title="Direct link to Cursor rules" translate="no">​</a></h2>
<ol>
<li class="">Take <code>end_cursor</code> <strong>only</strong> from <code>page_info</code> — nodes contain
internal cursor fields that look identical and produce
<code>Invalid Cursor</code> errors.</li>
<li class="">Pass it verbatim as <code>after</code>; never decode or slice it.</li>
<li class="">Cursors are reusable and session-independent — safe to checkpoint
long exports.</li>
</ol>
<p>A broken cursor returns <strong>400 Invalid Cursor</strong> (not billed) — restart
the walk from page 1.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="enrich-with-members">Enrich with members<a href="https://getsocialapi.com/blog/facebook-group-posts-api/#enrich-with-members" class="hash-link" aria-label="Direct link to Enrich with members" title="Direct link to Enrich with members" translate="no">​</a></h2>
<p>Post collection answers "what"; the
<a class="" href="https://getsocialapi.com/docs/api/facebook/members/">group members endpoint</a> answers "who".
Cross-referencing post authors against the member export catches
lurkers (members who never post) and power posters (members
dominating the feed) — the two lists every community manager wants.</p>
<p>Start on <a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a> — 100 free
calls cover a small group end to end.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/facebook-group-posts-api/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/facebook-api/" target="_blank" rel="noopener noreferrer" class="">Facebook API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Facebook</category>
            <category>groups</category>
            <category>Pagination</category>
        </item>
        <item>
            <title><![CDATA[Facebook profile API: resolve links, pull the overview]]></title>
            <link>https://getsocialapi.com/blog/facebook-resolve-overview/</link>
            <guid>https://getsocialapi.com/blog/facebook-resolve-overview/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Resolve any facebook.com URL to an id, then pull the profile card — the entry pair for every Facebook pipeline.]]></description>
            <content:encoded><![CDATA[<p>Every Facebook pipeline starts with the same two questions: <em>which
entity is this URL</em>, and <em>what does the world see of it</em>. Facebook
URLs are notoriously polymorphic — profiles, pages, groups, posts,
<code>profile.php?id=</code> forms, <code>people/</code> aliases — and guessing wrong wastes
every downstream call. Two endpoints settle it.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="step-1-resolve-the-link">Step 1: resolve the link<a href="https://getsocialapi.com/blog/facebook-resolve-overview/#step-1-resolve-the-link" class="hash-link" aria-label="Direct link to Step 1: resolve the link" title="Direct link to Step 1: resolve the link" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /fb/resolve?url=https://www.facebook.com/groups/800246542990860</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">GET /fb/api/v1/resolve-profile?profile_url=https://facebook.com/zuck</span><br></div></code></pre></div></div>
<p>The <a class="" href="https://getsocialapi.com/docs/api/facebook/resolve/">link resolver</a> classifies any
facebook.com URL — profile, group, page or post — and returns its
numeric id and type. The
<a class="" href="https://getsocialapi.com/docs/api/facebook/resolve-profile/">profile resolver</a> is the focused
variant for profile/page URLs, including the <code>people/…</code> alias forms
that redirect everywhere else.</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi_facebook </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">facebook</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">entity </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"https://www.facebook.com/groups/800246542990860"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">entity</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># type + numeric id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">uid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">resolve_profile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"https://facebook.com/zuck"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>The id is the key every other endpoint wants: members, posts, feed,
followers, friends, contacts.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="step-2-pull-the-overview-card">Step 2: pull the overview card<a href="https://getsocialapi.com/blog/facebook-resolve-overview/#step-2-pull-the-overview-card" class="hash-link" aria-label="Direct link to Step 2: pull the overview card" title="Direct link to Step 2: pull the overview card" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /fb/api/v1/overview?user_id=&lt;id&gt;</span><br></div></code></pre></div></div>
<p>The <a class="" href="https://getsocialapi.com/docs/api/facebook/overview/">overview</a> is the cheap profile
card: name, avatar, verification, friend/follower counters, privacy
posture. Before spending requests on deep lists, the overview answers
the gating questions:</p>
<table><thead><tr><th>Check</th><th>Why</th></tr></thead><tbody><tr><td>privacy flags</td><td>hidden lists return empty — know before you walk</td></tr><tr><td>follower/friend counters</td><td>sizes the export budget</td></tr><tr><td>verification</td><td>entity confirmation for due-diligence flows</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-pattern">The pattern<a href="https://getsocialapi.com/blog/facebook-resolve-overview/#the-pattern" class="hash-link" aria-label="Direct link to The pattern" title="Direct link to The pattern" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">target </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">profile_url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># any URL form in</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">card </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">overview</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">target_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic"># what exists, what's public</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> card says lists are public</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    followers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> walk</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> target_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    friends   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> walk</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">friends</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> target_id</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Resolve → overview → deep lists. The first two calls cost two units
and prevent entire wasted walks on private or misclassified targets.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="where-the-ids-flow-next">Where the ids flow next<a href="https://getsocialapi.com/blog/facebook-resolve-overview/#where-the-ids-flow-next" class="hash-link" aria-label="Direct link to Where the ids flow next" title="Direct link to Where the ids flow next" translate="no">​</a></h2>
<ul>
<li class="">Groups → <a class="" href="https://getsocialapi.com/docs/api/facebook/members/">members</a>,
<a class="" href="https://getsocialapi.com/docs/api/facebook/group_posts/">group posts</a>,
<a class="" href="https://getsocialapi.com/docs/api/facebook/feed/">unified feed</a></li>
<li class="">Profiles/pages → <a class="" href="https://getsocialapi.com/docs/api/facebook/followers/">followers</a>,
<a class="" href="https://getsocialapi.com/docs/api/facebook/followings/">followings</a>,
<a class="" href="https://getsocialapi.com/docs/api/facebook/friends/">friends</a>,
<a class="" href="https://getsocialapi.com/docs/api/facebook/contacts/">contacts</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="handling-the-alias-zoo">Handling the alias zoo<a href="https://getsocialapi.com/blog/facebook-resolve-overview/#handling-the-alias-zoo" class="hash-link" aria-label="Direct link to Handling the alias zoo" title="Direct link to Handling the alias zoo" translate="no">​</a></h2>
<p>Facebook happily serves several URLs for one entity: <code>facebook.com/zuck</code>,
<code>fb.com/zuck</code>, <code>m.facebook.com/zuck</code>, <code>profile.php?id=4</code>. Don't
normalize URLs client-side — the resolver tracks canonicalization
server-side, and its answer is the id your pipeline should trust.</p>
<p>Two calls, any URL in, stable id out —
<a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a>, 100 free calls to wire
the pair into your stack.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/facebook-resolve-overview/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/facebook-api/" target="_blank" rel="noopener noreferrer" class="">Facebook API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Facebook</category>
            <category>resolve</category>
            <category>profiles</category>
        </item>
        <item>
            <title><![CDATA[About this account via API: country, join date, former usernames]]></title>
            <link>https://getsocialapi.com/blog/instagram-about-this-account-api/</link>
            <guid>https://getsocialapi.com/blog/instagram-about-this-account-api/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The About-this-account screen — country, registration month, former username count, shared-followers accounts — is available as a single API call.]]></description>
            <content:encoded><![CDATA[<p>Before trusting an Instagram account — a seller in your marketplace, an
influencer pitch, a counterparty in a deal — you check the <strong>About this
account</strong> screen: which country the account declares, when it was
created, how many usernames it burned through. That screen has an API
counterpart, and it is one call:
<a class="" href="https://getsocialapi.com/docs/api/instagram/user/about/"><code>GET /user/about/{user_id}</code></a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-call">The call<a href="https://getsocialapi.com/blog/instagram-about-this-account-api/#the-call" class="hash-link" aria-label="Direct link to The call" title="Direct link to The call" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-bash codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">curl -H "X-API-Key: $KEY" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "https://api.getsocialapi.com/v1/user/about/25025320"</span><br></div></code></pre></div></div>
<div class="language-json codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-json codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"username"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"instagram"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"country"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"United States"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"joined_at"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"February 2012"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"former_usernames"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"accounts_with_shared_followers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"is_verified"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"unavailable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"has_about_data"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="how-to-read-the-fields">How to read the fields<a href="https://getsocialapi.com/blog/instagram-about-this-account-api/#how-to-read-the-fields" class="hash-link" aria-label="Direct link to How to read the fields" title="Direct link to How to read the fields" translate="no">​</a></h2>
<table><thead><tr><th>Field</th><th>Reading</th></tr></thead><tbody><tr><td><code>country</code></td><td>what the account <em>declares</em> — treat as a signal, not proof</td></tr><tr><td><code>joined_at</code></td><td>registration month; a 2025 join date on a "brand" account is a red flag</td></tr><tr><td><code>former_usernames</code></td><td>count of previous handles; high values track rebranded or bought accounts</td></tr><tr><td><code>accounts_with_shared_followers</code></td><td>how many suggested accounts share the audience — bot farms cluster here</td></tr><tr><td><code>is_verified</code></td><td>platform badge</td></tr><tr><td><code>unavailable</code></td><td>deleted/banned — other fields are useless</td></tr><tr><td><code>has_about_data</code></td><td>always check before using values</td></tr></tbody></table>
<p>Sparse and private accounts return <code>null</code> fields — that is normal, not
an error. The useful pattern for trust scoring:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">about </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">user_about</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> about</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"unavailable"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> about</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"has_about_data"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    risk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"unknown"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> about</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"former_usernames"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> about</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"former_usernames"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    risk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"elevated"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    risk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"normal"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="pair-it-with-the-profile">Pair it with the profile<a href="https://getsocialapi.com/blog/instagram-about-this-account-api/#pair-it-with-the-profile" class="hash-link" aria-label="Direct link to Pair it with the profile" title="Direct link to Pair it with the profile" translate="no">​</a></h2>
<p><code>user_about</code> answers <em>who is behind the account</em>; the
<a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_info_by_id/">profile endpoint</a> answers
<em>what the account does</em> (follower ratio, bio, category). Together they
form a cheap two-call screen for fraud pipelines, marketplace onboarding
and due-diligence automations.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="takeaways">Takeaways<a href="https://getsocialapi.com/blog/instagram-about-this-account-api/#takeaways" class="hash-link" aria-label="Direct link to Takeaways" title="Direct link to Takeaways" translate="no">​</a></h2>
<p>One call, no cookies, no login — country, join date, former usernames
and shared-follower clustering for any account id. Resolve usernames to
ids with the <a class="" href="https://getsocialapi.com/docs/api/instagram/user/search/">search endpoint</a> first.
The first 100 calls are free — <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">start here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-about-this-account-api/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>profiles</category>
            <category>trust-safety</category>
        </item>
        <item>
            <title><![CDATA[Instagram comments API: full pagination with the min_id cursor]]></title>
            <link>https://getsocialapi.com/blog/instagram-comments-api-pagination/</link>
            <guid>https://getsocialapi.com/blog/instagram-comments-api-pagination/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to pull every comment from an Instagram post — the sort_order=recent contract, the next_min_id cursor, and the trap behind max_id.]]></description>
            <content:encoded><![CDATA[<p>Scraping Instagram comments looks trivial until you notice pages
overlapping or comments silently missing. The route has a pagination
contract that is easy to get wrong; this post documents the exact
protocol behind the <a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_comments/">media comments endpoint</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-endpoint">The endpoint<a href="https://getsocialapi.com/blog/instagram-comments-api-pagination/#the-endpoint" class="hash-link" aria-label="Direct link to The endpoint" title="Direct link to The endpoint" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /ig/media/comments/{pk}?sort_order=recent&amp;count=30&amp;min_id=&lt;cursor&gt;</span><br></div></code></pre></div></div>
<p>The media argument accepts a numeric pk <strong>or</strong> the shortcode from the
post URL (<code>Deu3BoCBbDP</code> from <code>instagram.com/p/Deu3BoCBbDP/</code>) — no
oEmbed resolution needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="rule-one-always-sort_orderrecent">Rule one: always <code>sort_order=recent</code><a href="https://getsocialapi.com/blog/instagram-comments-api-pagination/#rule-one-always-sort_orderrecent" class="hash-link" aria-label="Direct link to rule-one-always-sort_orderrecent" title="Direct link to rule-one-always-sort_orderrecent" translate="no">​</a></h2>
<p>Without it you get a <em>ranked preview</em> — roughly fifteen comments
Instagram considers interesting. Ranked pages come from different pool
accounts and <strong>overlap between requests</strong>: collecting them produces
duplicates and gaps.</p>
<p>With <code>sort_order=recent</code> the contract changes completely:</p>
<ul>
<li class="">pages are strictly chronological (newer → older)</li>
<li class="">pages are <strong>disjoint</strong> — concatenation is the final order, no sorting needed</li>
<li class="">the cursor <code>next_min_id</code> is always present while more comments exist</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="rule-two-the-cursor-is-next_min_id-never-max_id">Rule two: the cursor is <code>next_min_id</code>, never <code>max_id</code><a href="https://getsocialapi.com/blog/instagram-comments-api-pagination/#rule-two-the-cursor-is-next_min_id-never-max_id" class="hash-link" aria-label="Direct link to rule-two-the-cursor-is-next_min_id-never-max_id" title="Direct link to rule-two-the-cursor-is-next_min_id-never-max_id" translate="no">​</a></h2>
<p>The response carries <code>next_min_id</code> (a long JSON string with cursor
tokens — pass it back <strong>verbatim, URL-encoded</strong>; SDKs do this for you).
<code>next_max_id</code> is always null on this route: the classic <code>max_id</code>
pagination used by followers endpoints does not work here.</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">comments</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">media_comments</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Deu3BoCBbDP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                             sort_order</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"recent"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> min_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    comments </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"comments"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"next_min_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> cursor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">comments</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"comments collected"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="example-observations">Example observations<a href="https://getsocialapi.com/blog/instagram-comments-api-pagination/#example-observations" class="hash-link" aria-label="Direct link to Example observations" title="Direct link to Example observations" translate="no">​</a></h2>
<p>The figures below are illustrative observations, not a reproducible benchmark or a performance guarantee. Response sizes, latency and coverage depend on the target and upstream availability. Before sizing a production export, record the date, endpoint, parameters, page count and deduplicated item count for your own test.</p>
<p>Collecting every comment of a viral post (105 comments declared): 7
requests, 19.9 seconds total, <strong>zero duplicates, zero losses</strong>. Real
page size is 12–20 comments regardless of <code>count</code> (accepted range
1–50, effectively a hint).</p>
<p>Two honest caveats:</p>
<ol>
<li class=""><strong>The sum is below <code>comment_count</code>.</strong> The counter includes
spam-filtered comments nobody can see through any client. Expect
5–15% fewer items than the declared number on aged posts.</li>
<li class=""><strong>Replies need a second pass.</strong> Each root comment carries
<code>child_comment_count</code>; threads are collected separately.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="bonus-likers-and-the-media-card">Bonus: likers and the media card<a href="https://getsocialapi.com/blog/instagram-comments-api-pagination/#bonus-likers-and-the-media-card" class="hash-link" aria-label="Direct link to Bonus: likers and the media card" title="Direct link to Bonus: likers and the media card" translate="no">​</a></h2>
<p>The same media argument works for the <a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_info/">media card</a>
(<code>items[0]</code>: pk, media_type, caption, like/comment/view counts, owner)
and <a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_likes/">likers</a> (up to ~100 users,
no pagination) — handy to enrich a comments export with post metadata.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="takeaways">Takeaways<a href="https://getsocialapi.com/blog/instagram-comments-api-pagination/#takeaways" class="hash-link" aria-label="Direct link to Takeaways" title="Direct link to Takeaways" translate="no">​</a></h2>
<p><code>sort_order=recent</code> + verbatim <code>next_min_id</code> until null is the complete
protocol. Ten lines of Python, one request per ~15 comments, and the
full comment section of any public post lands in your database —
<a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">open an account</a> and the
first 100 calls are on us.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-comments-api-pagination/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>comments</category>
            <category>Pagination</category>
        </item>
        <item>
            <title><![CDATA[Instagram followers API: export available followers with pagination]]></title>
            <link>https://getsocialapi.com/blog/instagram-followers-api-export/</link>
            <guid>https://getsocialapi.com/blog/instagram-followers-api-export/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Export available Instagram followers with max_id pagination, page sizing and name filtering. Understand verified-account and visibility limits.]]></description>
            <content:encoded><![CDATA[<p>Exporting an Instagram follower list is the canonical scraping task —
and the one where half-baked implementations lose people silently.
This is the exact contract behind the
<a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_followers/">followers endpoint</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-endpoint">The endpoint<a href="https://getsocialapi.com/blog/instagram-followers-api-export/#the-endpoint" class="hash-link" aria-label="Direct link to The endpoint" title="Direct link to The endpoint" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/followers/{user_id}?count=50&amp;max_id=&lt;cursor&gt;</span><br></div></code></pre></div></div>
<ul>
<li class=""><code>user_id</code> is the numeric pk — resolve a handle first with
<a class="" href="https://getsocialapi.com/docs/api/instagram/user/search/">user search</a></li>
<li class=""><code>count</code> is 1–50 (the page size you <em>request</em>)</li>
<li class=""><code>max_id</code> is the cursor: take <code>next_max_id</code> from the previous response
and pass it back verbatim</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-export-loop">The export loop<a href="https://getsocialapi.com/blog/instagram-followers-api-export/#the-export-loop" class="hash-link" aria-label="Direct link to The export loop" title="Direct link to The export loop" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"25025320"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> max_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    followers </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"users"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"next_max_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> cursor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"followers"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Collect each returned page and deduplicate by <code>pk</code>. Follower lists can change while an export is running, so cursor pagination alone does not guarantee a fixed snapshot or complete coverage.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="visibility-and-verified-account-limits">Visibility and verified-account limits<a href="https://getsocialapi.com/blog/instagram-followers-api-export/#visibility-and-verified-account-limits" class="hash-link" aria-label="Direct link to Visibility and verified-account limits" title="Direct link to Visibility and verified-account limits" translate="no">​</a></h2>
<p>Exports cover the follower data the endpoint makes available, rather than a guaranteed complete list. On verified accounts Instagram exposes approximately one page of 50 followers, without a continuation cursor; the name filter is ignored. Private or restricted accounts may return limited or no data. Follow the current <a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_followers/">endpoint limitations</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="name-filtering">Name filtering<a href="https://getsocialapi.com/blog/instagram-followers-api-export/#name-filtering" class="hash-link" aria-label="Direct link to Name filtering" title="Direct link to Name filtering" translate="no">​</a></h2>
<p>The endpoint accepts a <code>query</code> parameter pushed down to Instagram:
<code>query=marc</code> returns only followers whose name matches. It is the cheap
way to answer "does this account have a follower named X" without
exporting anything.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="request-budget-estimates-for-unverified-accounts">Request-budget estimates for unverified accounts<a href="https://getsocialapi.com/blog/instagram-followers-api-export/#request-budget-estimates-for-unverified-accounts" class="hash-link" aria-label="Direct link to Request-budget estimates for unverified accounts" title="Direct link to Request-budget estimates for unverified accounts" translate="no">​</a></h2>
<table><thead><tr><th>Account</th><th>Pages (count=50)</th><th>Requests</th><th>Notes</th></tr></thead><tbody><tr><td>~1k available followers</td><td>~20</td><td>~20</td><td>estimated at 50 returned users per page</td></tr><tr><td>~100k available followers</td><td>~2 000</td><td>~2 000</td><td>estimate; persist the cursor and resume later</td></tr><tr><td>private accounts</td><td>—</td><td>1</td><td>empty edges, <code>is_private</code> flag on the profile</td></tr></tbody></table>
<p>For large exports the cursor is your checkpoint: it is a stable,
session-independent string. Persist it, and resume the walk after any
interruption from exactly where you stopped.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="rate-limits-and-retries">Rate limits and retries<a href="https://getsocialapi.com/blog/instagram-followers-api-export/#rate-limits-and-retries" class="hash-link" aria-label="Direct link to Rate limits and retries" title="Direct link to Rate limits and retries" translate="no">​</a></h2>
<p>Follow your plan's RPS budget — exceed it and the gateway answers 429
with <code>Retry-After: 1</code>. Timeouts surface as 503 with <code>Retry-After: 2</code>;
retrying the identical request is safe because the cursor fully
determines the page. The official
<a href="https://github.com/GetSocialAPI/Instagram-Scraper-API" target="_blank" rel="noopener noreferrer" class="">Python SDK</a>
does this automatically: three retries, exponential backoff,
<code>Retry-After</code> respected.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="pair-it-with-following-for-a-mutuals-calculation">Pair it with following for a mutuals calculation<a href="https://getsocialapi.com/blog/instagram-followers-api-export/#pair-it-with-following-for-a-mutuals-calculation" class="hash-link" aria-label="Direct link to Pair it with following for a mutuals calculation" title="Direct link to Pair it with following for a mutuals calculation" translate="no">​</a></h2>
<p>Followers + <a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_following/">following</a> gives
you the social graph edges you need for the classic questions —
mutuals, follower ratio, ghost-following detection:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">followers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> export</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> uid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># who follows them</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">following </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> export</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">following</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> uid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># who they follow</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mutuals </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">u</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"pk"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> u </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> followers</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">u</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"pk"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> u </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> following</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>One account, two exports, every graph question answered — try it with
100 free calls on <a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-followers-api-export/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>followers</category>
            <category>Pagination</category>
        </item>
        <item>
            <title><![CDATA[Instagram hashtag mining: search, info and posts through an API]]></title>
            <link>https://getsocialapi.com/blog/instagram-hashtag-mining/</link>
            <guid>https://getsocialapi.com/blog/instagram-hashtag-mining/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Turn any hashtag into a dataset — search variants, size them by media count, then walk top and recent posts with cursor pagination.]]></description>
            <content:encoded><![CDATA[<p>Hashtags are Instagram's own taxonomy. Mined properly, a seed word
expands into its whole semantic neighborhood — every competitor tag,
sized by volume, with the posts to back it. Three endpoints do it.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="step-1-search-the-neighborhood">Step 1: search the neighborhood<a href="https://getsocialapi.com/blog/instagram-hashtag-mining/#step-1-search-the-neighborhood" class="hash-link" aria-label="Direct link to Step 1: search the neighborhood" title="Direct link to Step 1: search the neighborhood" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/hashtag/search/{query}</span><br></div></code></pre></div></div>
<p>The <a class="" href="https://getsocialapi.com/docs/api/instagram/hashtag/search/">hashtag search</a> returns every
tag matching the query with its media count — <code>#gymgirl</code>, <code>#gymgirlfit</code>,
<code>#gymgirls</code>… This is the expansion step: from one seed to the full
variant list, volume-ranked:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hashtag_search</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"gymgirl"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"results"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> t </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token builtin">sorted</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tags</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> key</span><span class="token operator" style="color:#393A34">=</span><span class="token keyword" style="color:#00009f">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"media_count"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> t</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"media_count"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>A leading <code>#</code> is accepted and trimmed — <code>#gym girl</code> resolves the same
as <code>gymgirl</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="step-2-size-each-tag">Step 2: size each tag<a href="https://getsocialapi.com/blog/instagram-hashtag-mining/#step-2-size-each-tag" class="hash-link" aria-label="Direct link to Step 2: size each tag" title="Direct link to Step 2: size each tag" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/hashtag/info/{tag}</span><br></div></code></pre></div></div>
<p><a class="" href="https://getsocialapi.com/docs/api/instagram/hashtag/get_info/">Hashtag info</a> resolves a tag to
its id and authoritative media count. In search results the counts can
be cached; before committing crawl budget, re-check the finalists.</p>
<p>The volume tiers that matter:</p>
<table><thead><tr><th>Media count</th><th>Tier</th><th>Strategy</th></tr></thead><tbody><tr><td>10M+</td><td>mega</td><td>visibility lottery; poor targeting</td></tr><tr><td>100k–10M</td><td>competitive</td><td>where ranking is realistic</td></tr><tr><td>1k–100k</td><td>niche</td><td>high relevance, low reach — mix in</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="step-3-walk-the-posts">Step 3: walk the posts<a href="https://getsocialapi.com/blog/instagram-hashtag-mining/#step-3-walk-the-posts" class="hash-link" aria-label="Direct link to Step 3: walk the posts" title="Direct link to Step 3: walk the posts" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/v2/hashtag/posts/{tag}?max_id=&lt;cursor&gt;</span><br></div></code></pre></div></div>
<p><a class="" href="https://getsocialapi.com/docs/api/instagram/hashtag/get_media/">Hashtag posts</a> return the
native page (~15–18 posts) with <code>next_max_id</code> for pagination. Items
carry caption, like/comment counts, owner and timestamps — everything
needed for engagement-rate scoring per tag:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hashtag_posts</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"#gymgirl"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> max_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    posts </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"posts"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"next_max_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> cursor </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">avg_er </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"like_count"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> p </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> posts</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="what-the-dataset-answers">What the dataset answers<a href="https://getsocialapi.com/blog/instagram-hashtag-mining/#what-the-dataset-answers" class="hash-link" aria-label="Direct link to What the dataset answers" title="Direct link to What the dataset answers" translate="no">​</a></h2>
<ul>
<li class=""><strong>Tag selection</strong> — relevance × competitiveness × observed
engagement, per variant.</li>
<li class=""><strong>Posting patterns</strong> — <code>taken_at</code> histograms: when a tag's audience
actually posts (proxy for when they browse).</li>
<li class=""><strong>Creator discovery</strong> — owners recurring across a tag's top posts
are its real community anchors; pull their
<a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_info_by_id/">profiles</a> next.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="scale-honestly">Scale honestly<a href="https://getsocialapi.com/blog/instagram-hashtag-mining/#scale-honestly" class="hash-link" aria-label="Direct link to Scale honestly" title="Direct link to Scale honestly" translate="no">​</a></h2>
<p>A 50-tag neighborhood at 200 posts each is ~700 requests. Checkpoint
<code>next_max_id</code> per tag — cursors are stable strings, so the crawl can
resume across days within plan limits.</p>
<p>Search, size, walk — three calls, one dataset, on
<a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a>. First 100 free.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-hashtag-mining/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>hashtags</category>
            <category>research</category>
        </item>
        <item>
            <title><![CDATA[Who liked an Instagram post: the likes API]]></title>
            <link>https://getsocialapi.com/blog/instagram-likes-api/</link>
            <guid>https://getsocialapi.com/blog/instagram-likes-api/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Pulling the likers of any Instagram post — the ~100 ceiling, shortcode arguments, and what likers data is actually good for.]]></description>
            <content:encoded><![CDATA[<p>Comments tell you what people think; likes tell you how many bothered
to react at all — and <em>who</em>. The
<a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_likes/">likes endpoint</a> returns the
likers of any public post in a single response.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-endpoint">The endpoint<a href="https://getsocialapi.com/blog/instagram-likes-api/#the-endpoint" class="hash-link" aria-label="Direct link to The endpoint" title="Direct link to The endpoint" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/media/likers/{pk|shortcode}</span><br></div></code></pre></div></div>
<p>The argument accepts the numeric media pk <strong>or</strong> the shortcode from
the post URL (<code>Deu3BoCBbDP</code> from <code>instagram.com/p/Deu3BoCBbDP/</code>) —
no oEmbed round-trip needed:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">likers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">media_likers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Deu3BoCBbDP"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"users"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">likers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"likers"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-honest-limits">The honest limits<a href="https://getsocialapi.com/blog/instagram-likes-api/#the-honest-limits" class="hash-link" aria-label="Direct link to The honest limits" title="Direct link to The honest limits" translate="no">​</a></h2>
<ul>
<li class=""><strong>Up to ~100 users, no pagination.</strong> Instagram caps the likers
surface; the endpoint returns what the platform exposes. For a post
with 95 740 likes you get the visible sample — typically the most
recent or most relevant hundred.</li>
<li class="">The like counter on the <a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_info/">media card</a>
is the true total; the likers list is a sample. Report both.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="what-the-sample-is-good-for">What the sample is good for<a href="https://getsocialapi.com/blog/instagram-likes-api/#what-the-sample-is-good-for" class="hash-link" aria-label="Direct link to What the sample is good for" title="Direct link to What the sample is good for" translate="no">​</a></h2>
<p>Even a sample supports real analysis:</p>
<ol>
<li class=""><strong>Audience composition</strong> — private/public ratio, verified share,
follower-count distribution of the accounts that engaged.</li>
<li class=""><strong>Engaged-audience diff</strong> — likers minus
<a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_comments/">commenters</a>: the silent
majority vs the conversational core.</li>
<li class=""><strong>Influencer vetting</strong> — a creator whose likers are 80% faceless
private accounts with default avatars is telling you something.</li>
<li class=""><strong>Competitor benchmarking</strong> — same sample across competing posts
normalizes engagement claims.</li>
</ol>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">info </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">media_info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Deu3BoCBbDP"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"items"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"declared:"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> info</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"like_count"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"| sample:"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">likers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">private_share </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> u </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> likers </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> u</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"is_private"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">likers</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="combining-the-three-engagement-surfaces">Combining the three engagement surfaces<a href="https://getsocialapi.com/blog/instagram-likes-api/#combining-the-three-engagement-surfaces" class="hash-link" aria-label="Direct link to Combining the three engagement surfaces" title="Direct link to Combining the three engagement surfaces" translate="no">​</a></h2>
<table><thead><tr><th>Endpoint</th><th>Gives you</th><th>Pagination</th></tr></thead><tbody><tr><td><a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_info/">Media info</a></td><td>counters (true totals)</td><td>—</td></tr><tr><td><a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_likes/">Likes</a></td><td>who reacted</td><td>none, ~100 sample</td></tr><tr><td><a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_comments/">Comments</a></td><td>what they said</td><td>full, via min_id</td></tr></tbody></table>
<p>Counters first (cheap), samples and comments second (deeper). That
ordering keeps request budgets sane on large analyses.</p>
<p>Likes are one call away — <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">100 free calls</a>
profile a dozen posts end to end.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-likes-api/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>engagement</category>
        </item>
        <item>
            <title><![CDATA[Instagram location API: mining posts by place]]></title>
            <link>https://getsocialapi.com/blog/instagram-location-api/</link>
            <guid>https://getsocialapi.com/blog/instagram-location-api/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Turn an Instagram location into a dataset — location card, coordinates, and paginated media for every place id.]]></description>
            <content:encoded><![CDATA[<p>Locations are Instagram's underrated dimension: every geotagged post
carries a place id, and every place id is a filter the platform
curated itself. For local research — venues, neighborhoods, events —
location mining beats keyword search on precision.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-two-endpoints">The two endpoints<a href="https://getsocialapi.com/blog/instagram-location-api/#the-two-endpoints" class="hash-link" aria-label="Direct link to The two endpoints" title="Direct link to The two endpoints" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/location/info/{pk}        # place card</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/location/media/{pk}       # posts at the place, paginated</span><br></div></code></pre></div></div>
<p>The <a class="" href="https://getsocialapi.com/docs/api/instagram/location/get_info/">location card</a> returns
name, address, coordinates and the media count — everything needed to
verify you have the right place among same-named venues:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">loc </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">location_info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pk</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">loc</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> loc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lat"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> loc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lng"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> loc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"media_count"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="walking-the-media">Walking the media<a href="https://getsocialapi.com/blog/instagram-location-api/#walking-the-media" class="hash-link" aria-label="Direct link to Walking the media" title="Direct link to Walking the media" translate="no">​</a></h2>
<p>The <a class="" href="https://getsocialapi.com/docs/api/instagram/location/get_media/">location media</a> route is
native-page paginated: pass <code>next_max_id</code> back as <code>max_id</code> while it is
returned. Items are the standard media shape — captions, counters,
owners, timestamps.</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">location_media</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pk</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> max_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    posts </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"items"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"next_max_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> cursor </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">500</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><br></div></code></pre></div></div>
<p>One trap: the response also carries a <code>next_page</code> counter. It is a
<em>page number</em>, not a cursor — using it as <code>max_id</code> returns Invalid
Cursor. <code>next_max_id</code> or bust.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="where-place-ids-come-from">Where place ids come from<a href="https://getsocialapi.com/blog/instagram-location-api/#where-place-ids-come-from" class="hash-link" aria-label="Direct link to Where place ids come from" title="Direct link to Where place ids come from" translate="no">​</a></h2>
<ul>
<li class="">Media items themselves: every geotagged post from
<a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_media/">user media</a> or
<a class="" href="https://getsocialapi.com/docs/api/instagram/hashtag/get_media/">hashtag posts</a> carries its
location id in the payload.</li>
<li class="">The venue's own Instagram profile often pins its place.</li>
</ul>
<p>Harvest ids from any media stream you already collect, dedupe, then
expand each into its own post set.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="what-location-datasets-answer">What location datasets answer<a href="https://getsocialapi.com/blog/instagram-location-api/#what-location-datasets-answer" class="hash-link" aria-label="Direct link to What location datasets answer" title="Direct link to What location datasets answer" translate="no">​</a></h2>
<table><thead><tr><th>Question</th><th>Method</th></tr></thead><tbody><tr><td>Footfall proxy</td><td>post volume per time bucket from <code>taken_at</code></td></tr><tr><td>Venue popularity trend</td><td>media count + ER over rolling windows</td></tr><tr><td>Event detection</td><td>volume spikes vs baseline at a place</td></tr><tr><td>Local creator discovery</td><td>owners recurring across a place's posts</td></tr><tr><td>Competitive set</td><td>same-category venues within radius, via coordinates</td></tr></tbody></table>
<p>Coordinates in the location card make radius queries trivial —
harvest cards for all candidate venues, filter by haversine distance,
then walk only the ones inside your fence.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="scale-notes">Scale notes<a href="https://getsocialapi.com/blog/instagram-location-api/#scale-notes" class="hash-link" aria-label="Direct link to Scale notes" title="Direct link to Scale notes" translate="no">​</a></h2>
<p>A venue with 50k geotagged posts is ~2 500 pages at native size —
checkpoint the cursor per location and resume across sessions (see
the <a class="" href="https://getsocialapi.com/blog/api-rate-limits-retries/">rate limits guide</a>). For dense
city-center research, sample by time window instead of full walks:
the goal is usually the distribution, not the census.</p>
<p>Place ids in, posts out — <a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a>,
first 100 calls free.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-location-api/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>locations</category>
            <category>research</category>
        </item>
        <item>
            <title><![CDATA[Instagram stories and highlights via API]]></title>
            <link>https://getsocialapi.com/blog/instagram-stories-highlights-api/</link>
            <guid>https://getsocialapi.com/blog/instagram-stories-highlights-api/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Active stories and permanent highlights — how to pull ephemeral content, per-story metrics, and the highlight id pipeline.]]></description>
            <content:encoded><![CDATA[<p>Stories are where the daily attention lives — and highlights turn that
ephemeral layer into a permanent archive the account curates itself.
Both are one call each, and they compose into a pipeline.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="active-stories">Active stories<a href="https://getsocialapi.com/blog/instagram-stories-highlights-api/#active-stories" class="hash-link" aria-label="Direct link to Active stories" title="Direct link to Active stories" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/user/stories/{user_id}</span><br></div></code></pre></div></div>
<p>The <a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_stories/">stories endpoint</a> returns
the currently live tray: images, videos, timestamps, and for video
items the view and reaction counters the account itself can see. No
pagination — the tray is small by nature (24h lifetime, max 100 items).</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">stories </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">user_stories</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"25025320"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># items[] with taken_at, media urls</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> s </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> stories</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"items"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"taken_at"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"media_type"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="highlights-the-curated-archive">Highlights: the curated archive<a href="https://getsocialapi.com/blog/instagram-stories-highlights-api/#highlights-the-curated-archive" class="hash-link" aria-label="Direct link to Highlights: the curated archive" title="Direct link to Highlights: the curated archive" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/user/highlights/{user_id}          # tray: ids + titles</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/highlight/stories/{highlight_id}   # stories inside one highlight</span><br></div></code></pre></div></div>
<p>The <a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_highlights/">highlights tray</a> lists
the account's highlight reels — <code>id</code>, <code>title</code>, cover media. Each reel
unfolds through <a class="" href="https://getsocialapi.com/docs/api/instagram/highlight/get_stories/">highlight stories</a>:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">tray </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">user_highlights</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"25025320"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> h </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tray</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"tray"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    reel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">highlight_stories</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">h</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"highlight:"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">h</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"title"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-&gt;"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">reel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"items"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"stories"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Note the <code>highlight:</code> prefix some trays carry on ids — strip it before
the second call (the SDK does this for you).</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="why-highlights-matter-more-than-they-look">Why highlights matter more than they look<a href="https://getsocialapi.com/blog/instagram-stories-highlights-api/#why-highlights-matter-more-than-they-look" class="hash-link" aria-label="Direct link to Why highlights matter more than they look" title="Direct link to Why highlights matter more than they look" translate="no">​</a></h2>
<p>Highlights are the <em>only</em> Instagram surface where the account itself
performs permanent editorial selection. The tray order, titles, and
what got promoted from stories to highlight — that combination is a
free, self-reported content strategy:</p>
<ul>
<li class=""><strong>Product catalogs</strong> — shops keep catalogs as highlights; the tray
<em>is</em> the catalog structure.</li>
<li class=""><strong>Link-in-bio analytics</strong> — link stickers inside highlight stories
are permanent CTAs; extracting them gives a real conversion surface
inventory.</li>
<li class=""><strong>Compliance archiving</strong> — regulated industries must archive
ephemeral marketing; highlights capture what the account chose to
keep, stories what existed.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-daily-pipeline">The daily pipeline<a href="https://getsocialapi.com/blog/instagram-stories-highlights-api/#the-daily-pipeline" class="hash-link" aria-label="Direct link to The daily pipeline" title="Direct link to The daily pipeline" translate="no">​</a></h2>
<ol>
<li class="">Poll stories for target accounts (they live 24h — cadence matters).</li>
<li class="">Diff against your store; save new items with <code>taken_at</code>.</li>
<li class="">On tray changes, pull the affected highlight and link its stories.</li>
<li class="">Enrich with the <a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_info_by_id/">profile card</a>
for follower context.</li>
</ol>
<p>Two endpoints, one id quirk, no pagination to get wrong. Start
tracking on <a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a> — 100 free
calls.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-stories-highlights-api/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>stories</category>
            <category>highlights</category>
        </item>
        <item>
            <title><![CDATA[Instagram user posts API: exporting the profile grid]]></title>
            <link>https://getsocialapi.com/blog/instagram-user-posts-api/</link>
            <guid>https://getsocialapi.com/blog/instagram-user-posts-api/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Pull the full posting history of any Instagram profile — grid pagination with max_id, media types and engagement fields.]]></description>
            <content:encoded><![CDATA[<p>A profile grid is the public face of an account — and a complete grid
export is engagement analysis, content auditing and growth tracking in
one dataset. The <a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_media/">user media endpoint</a>
walks it page by page.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-endpoint">The endpoint<a href="https://getsocialapi.com/blog/instagram-user-posts-api/#the-endpoint" class="hash-link" aria-label="Direct link to The endpoint" title="Direct link to The endpoint" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/ig/user/media/{user_id}?count=12&amp;max_id=&lt;cursor&gt;</span><br></div></code></pre></div></div>
<p><code>user_id</code> is the numeric pk (see
<a class="" href="https://getsocialapi.com/blog/instagram-username-to-id/">username resolution</a>); <code>count</code> sets
the requested page size; <code>max_id</code> carries the cursor from the previous
response's <code>next_max_id</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-walk">The walk<a href="https://getsocialapi.com/blog/instagram-user-posts-api/#the-walk" class="hash-link" aria-label="Direct link to The walk" title="Direct link to The walk" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">user_medias</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"25025320"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> max_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    posts </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"items"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"next_max_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> cursor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">posts</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"posts"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Pages concatenate cleanly — no dedupe needed for a stable account.
For an account that posts mid-export, re-run and merge by media pk.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="what-each-item-carries">What each item carries<a href="https://getsocialapi.com/blog/instagram-user-posts-api/#what-each-item-carries" class="hash-link" aria-label="Direct link to What each item carries" title="Direct link to What each item carries" translate="no">​</a></h2>
<table><thead><tr><th>Field</th><th>Meaning</th></tr></thead><tbody><tr><td><code>media_type</code></td><td>1 = photo, 2 = video, 8 = carousel</td></tr><tr><td><code>caption.text</code></td><td>post caption (first carousel item for carousels)</td></tr><tr><td><code>like_count</code>, <code>comment_count</code></td><td>engagement counters</td></tr><tr><td><code>view_count</code></td><td>video views</td></tr><tr><td><code>taken_at</code></td><td>publish timestamp</td></tr><tr><td><code>carousel_media[]</code></td><td>per-item media for type 8</td></tr></tbody></table>
<p>The media-type split alone answers most content-strategy questions:
photo/video/carousel ratio, engagement by format, posting cadence from
<code>taken_at</code> deltas.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="variants-worth-knowing">Variants worth knowing<a href="https://getsocialapi.com/blog/instagram-user-posts-api/#variants-worth-knowing" class="hash-link" aria-label="Direct link to Variants worth knowing" title="Direct link to Variants worth knowing" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_tags/">Tagged posts</a> — posts where the
account appears tagged; same pagination contract. Good for UGC
monitoring.</li>
<li class=""><a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_stories/">Stories</a> — the ephemeral
layer, no pagination (active stories in one response).</li>
<li class=""><a class="" href="https://getsocialapi.com/docs/api/instagram/hashtag/get_media/">Hashtag posts</a> — the same
item shape from a different entry point.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="sizing-the-export">Sizing the export<a href="https://getsocialapi.com/blog/instagram-user-posts-api/#sizing-the-export" class="hash-link" aria-label="Direct link to Sizing the export" title="Direct link to Sizing the export" translate="no">​</a></h2>
<p>A 500-post archive is ~40 requests at <code>count=12</code> — under a minute
within plan RPS. For 10 000+ post archives, checkpoint the cursor
every N pages; it is stable across sessions, so the export can resume
after any interruption without re-walking.</p>
<p>The Python walker above is ~8 lines — <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">100 free calls</a>
cover a medium-sized profile end to end.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-user-posts-api/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>media</category>
            <category>Pagination</category>
        </item>
        <item>
            <title><![CDATA[How to resolve an Instagram username to a user id]]></title>
            <link>https://getsocialapi.com/blog/instagram-username-to-id/</link>
            <guid>https://getsocialapi.com/blog/instagram-username-to-id/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Username to pk resolution — search, username lookup, and the shortcode trap nobody warns you about.]]></description>
            <content:encoded><![CDATA[<p>Almost every Instagram endpoint wants the numeric user id (pk) — and
almost every workflow starts with a handle. The gap between the two is
where bad data enters pipelines. This is every resolution path that
works, and the one that silently does not.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="path-1-search-the-default">Path 1: search (the default)<a href="https://getsocialapi.com/blog/instagram-username-to-id/#path-1-search-the-default" class="hash-link" aria-label="Direct link to Path 1: search (the default)" title="Direct link to Path 1: search (the default)" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">GET /v1/search/username/{query}?count=10</span><br></div></code></pre></div></div>
<p>Returns up to ten matches with <code>pk</code>, <code>username</code>, <code>full_name</code>,
<code>is_private</code>, <code>is_verified</code>. For a unique handle the first hit is the
account; for ambiguous handles (<code>@john</code>), rank by <code>follower_count</code> or
require exact <code>username</code> equality:</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">hits </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">search_username</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"natgeo"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"users"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">next</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">u </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> u </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> hits </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> u</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"username"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"natgeo"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">uid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">match</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"pk"</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="path-2-username-lookup-exact">Path 2: username lookup (exact)<a href="https://getsocialapi.com/blog/instagram-username-to-id/#path-2-username-lookup-exact" class="hash-link" aria-label="Direct link to Path 2: username lookup (exact)" title="Direct link to Path 2: username lookup (exact)" translate="no">​</a></h2>
<p>When you already trust the handle, the
<a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_info_by_username/">username endpoint</a>
resolves it to the full profile in one call — pk plus biography,
counters, category. One call instead of search + info.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-trap-shortcodes-are-not-ids">The trap: shortcodes are not ids<a href="https://getsocialapi.com/blog/instagram-username-to-id/#the-trap-shortcodes-are-not-ids" class="hash-link" aria-label="Direct link to The trap: shortcodes are not ids" title="Direct link to The trap: shortcodes are not ids" translate="no">​</a></h2>
<p>Media shortcodes — the <code>Deu3BoCBbDP</code> in
<code>instagram.com/p/Deu3BoCBbDP/</code> — historically encoded the media pk in
base64, and half the internet still "decodes" them client-side. Two
reasons to stop:</p>
<ol>
<li class="">The encoding changed. New shortcodes (the <code>D…</code> family) decode to
<em>wrong</em> numbers — silently, with no error.</li>
<li class="">It was never a contract.</li>
</ol>
<p>The robust options:</p>
<ul>
<li class="">Media endpoints that accept a shortcode directly
(<a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_info/">media info</a>,
<a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_comments/">comments</a>,
<a class="" href="https://getsocialapi.com/docs/api/instagram/media/get_likes/">likes</a>) — pass it as the
argument, no conversion needed.</li>
<li class="">For the raw pk: Instagram's public oEmbed endpoint returns the
<code>media_id</code> — the number before the underscore.</li>
</ul>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> requests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> urllib</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">parse </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> quote</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"https://i.instagram.com/api/v1/oembed/"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    params</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"url"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://www.instagram.com/p/Deu3BoCBbDP/"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    timeout</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"media_id"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"_"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># e.g. 4012386322294878415</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="user-id-vs-media-id-vs-comment-id">User id vs media id vs comment id<a href="https://getsocialapi.com/blog/instagram-username-to-id/#user-id-vs-media-id-vs-comment-id" class="hash-link" aria-label="Direct link to User id vs media id vs comment id" title="Direct link to User id vs media id vs comment id" translate="no">​</a></h2>
<table><thead><tr><th>Entity</th><th>Field</th><th>Looks like</th><th>Used by</th></tr></thead><tbody><tr><td>Account</td><td><code>pk</code></td><td><code>25025320</code></td><td>profile, followers, following, media</td></tr><tr><td>Media</td><td><code>pk</code> / <code>id</code></td><td><code>4012386322294878415_25025320</code></td><td>media info, comments, likes</td></tr><tr><td>Comment</td><td><code>pk</code></td><td><code>18120167255059206</code></td><td>reply threads</td></tr></tbody></table>
<p>The suffix after the underscore in a media id is the <em>owner</em> pk —
strip it before passing the id anywhere else.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="caching-discipline">Caching discipline<a href="https://getsocialapi.com/blog/instagram-username-to-id/#caching-discipline" class="hash-link" aria-label="Direct link to Caching discipline" title="Direct link to Caching discipline" translate="no">​</a></h2>
<p>Resolution is the cheapest call you will make and the most wasteful to
repeat. Cache handle → pk pairs (they are stable; handles change, ids
never do), and re-resolve only on 404 from downstream endpoints.</p>
<p>All the endpoints above are live on
<a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a> — 100 free calls, no
cookies required.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/instagram-username-to-id/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>resolve</category>
            <category>shortcodes</category>
        </item>
        <item>
            <title><![CDATA[No-cookie scraping: how a data API stays up while scrapers die]]></title>
            <link>https://getsocialapi.com/blog/no-cookie-scraping-architecture/</link>
            <guid>https://getsocialapi.com/blog/no-cookie-scraping-architecture/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Why cookie-based Instagram and Facebook scrapers rot, and how a pool-account architecture with cursor-based APIs stays stable for years.]]></description>
            <content:encoded><![CDATA[<p>Every few months another open-source Instagram scraper archive goes
read-only. The READMEs all end the same way: "blocked", "login
required", "risk of account ban". The failure isn't the code — it's
the architecture. This post is about the difference.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="why-cookie-based-scraping-fails-structurally">Why cookie-based scraping fails structurally<a href="https://getsocialapi.com/blog/no-cookie-scraping-architecture/#why-cookie-based-scraping-fails-structurally" class="hash-link" aria-label="Direct link to Why cookie-based scraping fails structurally" title="Direct link to Why cookie-based scraping fails structurally" translate="no">​</a></h2>
<p>A self-hosted scraper logs in as <em>you</em> (or accounts you manage) and
browse the way a human would. Three structural problems follow:</p>
<ol>
<li class=""><strong>One identity, one fingerprint.</strong> Every request comes from your IP
with your cookies. Anomaly detection needs one signal — you.</li>
<li class=""><strong>You are the bottleneck.</strong> Rate limits are per-account. Scale
means more accounts, which means more bans, which means more
accounts.</li>
<li class=""><strong>The client breaks weekly.</strong> Frontend changes, challenge pages,
forced re-logins — the maintenance tax compounds until the
maintainer quits.</li>
</ol>
<p>The API-key model inverts all three: many identities on the provider
side, your IP never touches Instagram, and the client contract is a
stable REST surface with cursors instead of DOM selectors.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="what-no-cookies-means-in-practice">What "no cookies" means in practice<a href="https://getsocialapi.com/blog/no-cookie-scraping-architecture/#what-no-cookies-means-in-practice" class="hash-link" aria-label="Direct link to What &quot;no cookies&quot; means in practice" title="Direct link to What &quot;no cookies&quot; means in practice" translate="no">​</a></h2>
<p>With a data API the only credential you hold is an API key. No
accounts, no sessions, no 2FA puzzles. Concretely, on
<a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a>:</p>
<ul>
<li class="">collection runs on provider infrastructure and pool accounts — your
profiles stay out of the loop entirely (there is nothing to ban);</li>
<li class="">a request is either a paginated cursor walk or a single lookup —
deterministic, retryable, cacheable;</li>
<li class="">failures are <em>states</em>, not surprises: HTTP codes tell you exactly
what happened and what to do next.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="the-failure-model-honestly">The failure model, honestly<a href="https://getsocialapi.com/blog/no-cookie-scraping-architecture/#the-failure-model-honestly" class="hash-link" aria-label="Direct link to The failure model, honestly" title="Direct link to The failure model, honestly" translate="no">​</a></h2>
<table><thead><tr><th>Code</th><th>Meaning</th><th>Correct action</th></tr></thead><tbody><tr><td><code>200</code> / <code>404</code></td><td>done / not found (billed)</td><td>proceed</td></tr><tr><td><code>400</code></td><td>client bug: bad cursor or argument</td><td>fix the caller, don't retry</td></tr><tr><td><code>429</code></td><td>over plan RPS</td><td>sleep <code>Retry-After</code>, then continue</td></tr><tr><td><code>503</code></td><td>upstream busy</td><td>retry the <em>same</em> request after <code>Retry-After</code></td></tr><tr><td><code>5xx</code> else</td><td>transient</td><td>exponential backoff</td></tr></tbody></table>
<p>Billed states are only 200/404 — a request that times out or errors
costs nothing. Cursors are stable strings, independent of sessions:
<strong>any</strong> interrupted walk resumes exactly where it stopped, from any
client. That single property is what makes million-request exports
tractable.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="idempotent-pagination-the-quiet-superpower">Idempotent pagination: the quiet superpower<a href="https://getsocialapi.com/blog/no-cookie-scraping-architecture/#idempotent-pagination-the-quiet-superpower" class="hash-link" aria-label="Direct link to Idempotent pagination: the quiet superpower" title="Direct link to Idempotent pagination: the quiet superpower" translate="no">​</a></h2>
<p>DOM scraping checkpoints are fragile because page N is re-derived from
UI state. Cursor pagination is a pure function of the cursor: same
cursor in, same page out. Combine that with a 503-retry and you get
exactly-once collection semantics at the page level — the unit that
matters for billing and for data integrity.</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">try</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> max_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">except</span><span class="token plain"> ServiceUnavailable </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 503</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">retry_after</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    store</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">page</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"next_max_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> cursor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">break</span><br></div></code></pre></div></div>
<p>The official <a href="https://github.com/GetSocialAPI/Instagram-Scraper-API" target="_blank" rel="noopener noreferrer" class="">Python SDK</a>
ships this loop's retry logic built in — three attempts, backoff,
<code>Retry-After</code> respected.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="when-self-hosted-still-makes-sense">When self-hosted still makes sense<a href="https://getsocialapi.com/blog/no-cookie-scraping-architecture/#when-self-hosted-still-makes-sense" class="hash-link" aria-label="Direct link to When self-hosted still makes sense" title="Direct link to When self-hosted still makes sense" translate="no">​</a></h2>
<p>Honesty cuts both ways: if your volume is tiny, your targets obscure,
and your timeline flexible — a self-hosted scraper is free. The moment
any of those three changes, the maintenance tax exceeds any API bill.
The API is not the cheap option; it is the <em>flat-cost</em> option.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="takeaway">Takeaway<a href="https://getsocialapi.com/blog/no-cookie-scraping-architecture/#takeaway" class="hash-link" aria-label="Direct link to Takeaway" title="Direct link to Takeaway" translate="no">​</a></h2>
<p>Scrapers die because identity is fragile. Data APIs survive because
they move the fragile part behind a contract: a key, a cursor, an HTTP
code. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">100 free calls</a> is
enough to feel the difference.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/no-cookie-scraping-architecture/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> and <a href="https://getsocialapi.com/facebook-api/" target="_blank" rel="noopener noreferrer" class="">Facebook API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>architecture</category>
            <category>reliability</category>
        </item>
        <item>
            <title><![CDATA[Social graph export: followers, following and mutuals in three calls]]></title>
            <link>https://getsocialapi.com/blog/social-graph-export/</link>
            <guid>https://getsocialapi.com/blog/social-graph-export/</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Combine followers, following and friends endpoints across both networks into one social-graph dataset — with mutuals, ratios and overlap in pure Python.]]></description>
            <content:encoded><![CDATA[<p>Individual connection lists are snapshots; a <em>social graph export</em> —
followers plus following on both sides of a relationship — is the
dataset that answers real questions. This tutorial builds one for a
cross-network workflow: an Instagram account and the Facebook page of
the same brand.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="what-we-export">What we export<a href="https://getsocialapi.com/blog/social-graph-export/#what-we-export" class="hash-link" aria-label="Direct link to What we export" title="Direct link to What we export" translate="no">​</a></h2>
<table><thead><tr><th>Endpoint</th><th>Network</th><th>Edges</th></tr></thead><tbody><tr><td><a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_followers/">Followers</a></td><td>Instagram</td><td>audience → account</td></tr><tr><td><a class="" href="https://getsocialapi.com/docs/api/instagram/user/get_following/">Following</a></td><td>Instagram</td><td>account → follows</td></tr><tr><td><a class="" href="https://getsocialapi.com/docs/api/facebook/followers/">Facebook followers</a></td><td>Facebook</td><td>audience → page</td></tr><tr><td><a class="" href="https://getsocialapi.com/docs/api/facebook/followings/">Facebook followings</a></td><td>Facebook</td><td>page → follows</td></tr></tbody></table>
<p>Four paginated walks, one shared helper — every list is cursor-based,
so the pattern is identical (see the
<a class="" href="https://getsocialapi.com/blog/instagram-followers-api-export/">followers export guide</a> for
the loop; Facebook uses <code>after</code> instead of <code>max_id</code>).</p>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> getsocialapi_facebook </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> FacebookAPI</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Transport</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">instagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> FacebookAPI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Transport</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    base_url</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"https://api.getsocialapi.com/fb"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gsa_live_..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ig_export</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> uid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    rows</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> max_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cursor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        rows </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"users"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        cursor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"next_max_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> cursor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> rows</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig_followers  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig_export</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">followers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ig_uid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ig_following  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ig_export</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">following</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ig_uid</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="mutuals-the-community-core">Mutuals: the community core<a href="https://getsocialapi.com/blog/social-graph-export/#mutuals-the-community-core" class="hash-link" aria-label="Direct link to Mutuals: the community core" title="Direct link to Mutuals: the community core" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">f_ids </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">u</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"pk"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> u </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> ig_followers</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">g_ids </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">u</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"pk"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> u </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> ig_following</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mutuals </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> f_ids </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> g_ids</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"followers=</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation builtin">len</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">(</span><span class="token string-interpolation interpolation">f_ids</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">)</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">, following=</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation builtin">len</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">(</span><span class="token string-interpolation interpolation">g_ids</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">)</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">, mutual=</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation builtin">len</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">(</span><span class="token string-interpolation interpolation">mutuals</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">)</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Mutuals are the strongest relationship signal both networks expose:
each side opted into the other. Growth teams treat mutual-count
trajectory as a leading engagement indicator — it moves before
follower count does.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="ratio-and-asymmetry">Ratio and asymmetry<a href="https://getsocialapi.com/blog/social-graph-export/#ratio-and-asymmetry" class="hash-link" aria-label="Direct link to Ratio and asymmetry" title="Direct link to Ratio and asymmetry" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-python codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">ratio </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f_ids</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">g_ids</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">one_way </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> g_ids </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> f_ids   </span><span class="token comment" style="color:#999988;font-style:italic"># follows them, they don't follow back</span><br></div></code></pre></div></div>
<ul>
<li class=""><code>ratio &gt;&gt; 1</code> — broadcast account (media, brand).</li>
<li class=""><code>ratio ≈ 1</code> with high mutuals — personal/community account.</li>
<li class=""><code>one_way</code> dominated by spam-pattern profiles — audience quality
debt.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="cross-network-identity-hints">Cross-network identity hints<a href="https://getsocialapi.com/blog/social-graph-export/#cross-network-identity-hints" class="hash-link" aria-label="Direct link to Cross-network identity hints" title="Direct link to Cross-network identity hints" translate="no">​</a></h2>
<p>Facebook pages and Instagram accounts of the same brand rarely share
ids — but they share <em>people</em>. Sample usernames/normalized names from
both follower lists and intersect: the overlap coefficient between
the two audiences measures how separable the communities really are
(marketing teams use it to decide whether to run one strategy or two).</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="storage-shape">Storage shape<a href="https://getsocialapi.com/blog/social-graph-export/#storage-shape" class="hash-link" aria-label="Direct link to Storage shape" title="Direct link to Storage shape" translate="no">​</a></h2>
<p>One table beats clever schemas at collection time:</p>
<div class="language-text codeBlockContainer_gTiT theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_TMpO"><pre tabindex="0" class="prism-code language-text codeBlock_bTT7 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_eY3D"><div class="token-line" style="color:#393A34"><span class="token plain">edges(source, target, network, edge_type, first_seen, last_seen)</span><br></div></code></pre></div></div>
<p>Re-running the export updates <code>last_seen</code>; edges that disappear move
to an archive table. Churn (edges with stale <code>last_seen</code>) is itself a
dataset — audience decay per account.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="budget-math">Budget math<a href="https://getsocialapi.com/blog/social-graph-export/#budget-math" class="hash-link" aria-label="Direct link to Budget math" title="Direct link to Budget math" translate="no">​</a></h2>
<p>A brand with 50k Instagram followers + 3k following and a Facebook
page with 20k followers is ~1 500 + 60 + ~1 300 + ~200 requests —
about 3 100 calls, an hour of polite pacing, resumable via cursors at
any point. The <a class="" href="https://getsocialapi.com/blog/api-rate-limits-retries/">rate limits guide</a>
covers the retry loop.</p>
<p>Four walks, one table, every graph question —
<a href="https://getsocialapi.com/" target="_blank" rel="noopener noreferrer" class="">getsocialapi.com</a>, first 100 calls free.</p>
<h2 class="anchor anchorTargetStickyNavbar_unoS" id="build-with-getsocialapi">Build with GetSocialAPI<a href="https://getsocialapi.com/blog/social-graph-export/#build-with-getsocialapi" class="hash-link" aria-label="Direct link to Build with GetSocialAPI" title="Direct link to Build with GetSocialAPI" translate="no">​</a></h2>
<p>Explore <a href="https://getsocialapi.com/instagram-api/" target="_blank" rel="noopener noreferrer" class="">Instagram API</a> and <a href="https://getsocialapi.com/facebook-api/" target="_blank" rel="noopener noreferrer" class="">Facebook API</a> for capabilities, pricing and integration examples. <a href="https://getsocialapi.com/dashboard/signup/" target="_blank" rel="noopener noreferrer" class="">Create an account</a> to start with 100 free calls, or follow the <a class="" href="https://getsocialapi.com/docs/quickstart/">quickstart</a>.</p>]]></content:encoded>
            <category>Instagram</category>
            <category>Facebook</category>
            <category>social-graph</category>
            <category>tutorial</category>
        </item>
    </channel>
</rss>