Sprout Social API in 2026: What It Returns, What It Costs, and Where Twitter (X) Data Runs Out

By TwitterAPI.io Team•16 min read
Two-panel diagram. Left, Sprout Social Public API (api.sproutsocial.com/v1, Advanced plan and up): owned profile analytics, post analytics, inbox and publishing, Listening topics for other networks; not included: Listening data from X, profiles you do not own, follower lists and arbitrary search, more than 60 requests a minute or 250,000 a month. Right, a pay-per-call X data API: any public profile, timeline, keyword search, followers and mentions at $0.15 per 1,000 posts; not included: private impressions and other networks.
What each API can see. Study collected in 2026: 1,300 posts from 13 brand accounts in 78 requests for $0.20.

This page is about one product: the Sprout Social Public API, what it returns, which plan unlocks it, how it is rate-limited, and where it stops when what you actually need is raw Twitter (X) data. It is not a roundup of social listening suites (our guide to X API options for social listening covers that), and it is not a Brandwatch comparison (the Brandwatch alternative page does that). If you searched "sprout social api" because a stakeholder asked for numbers Sprout's reports do not show, or because you want competitor data in your own warehouse, the answer starts with the scope line in Sprout's own docs.

We read Sprout's developer documentation and pricing page this session, then ran a small study on live X data: profiles and 100 recent posts each for 13 public brand accounts, including Sprout Social's and Hootsuite's own. The study shows the half of the picture Sprout's API cannot return, because it only reports on profiles you have connected: posting cadence and public engagement for accounts you do not own. A short section at the end covers the Hootsuite API, which raises the same question.

01 — Section

What the Sprout Social Public API actually returns

Sprout's documentation (api.sproutsocial.com/docs) opens with the scope in one sentence: the API exists "to access your owned social profile data so you can use that data to power dashboards and automate your reporting." Everything below follows from that. Each request path carries your Sprout customer ID (/v1/<customer_id>/<endpoint>), and analytics requests filter on the customer_profile_id values of profiles connected to your account.

AreaEndpoint (Sprout docs)What comes back
MetadataGET /v1/<customer_id>/metadata/customer (+ tags, groups, users, topics, teams, queues)Your connected profiles and account objects
Owned profile analyticsPOST /v1/<customer_id>/analytics/profilesDaily or lifetime metrics per connected profile
Post analyticsPOST /v1/<customer_id>/analytics/postsLifetime metrics for posts your profiles published
MessagesPOST /v1/<customer_id>/messagesMessages sent and received by your profiles (inbox data)
ListeningPOST /v1/<customer_id>/listening/topics/<topic_id>/messages and /metricsResults of Listening Topics you configured (not X)
Publishing and mediaPOST /v1/<customer_id>/publishing/posts, /media/Drafts and scheduled posts created inside Sprout
CasesPOST /v1/<customer_id>/cases/filterSocial care cases, one week per date filter

The "does not include" list. The same overview names three exclusions: paid (ad account) data, Listening data from X, and message-level Listening data from Reddit. The X metrics section repeats it: "X data is not available for Listening endpoints." So the Listening endpoints can return earned-media results for other networks, but not for X.

The X metrics you do get (owned profiles only). For an X profile you connect, the owned-profile metrics include followers (lifetime_snapshot.followers_count), net follower growth, impressions, video views, likes, @replies, reposts, post link clicks and posts sent. Several more (media views, media clicks, hashtag clicks, profile clicks, detail expands, app installs) are marked "Premium Analytics Required". Sprout computes engagements as likes + @replies + reposts + post link clicks + other post clicks + other engagements, and offers engagement rate per follower and per impression.

Shape limits worth knowing before you build. Analytics requests accept up to 100 profiles each, a reporting_period of at most one year, and responses are capped at 10,000 results with cursor pagination beyond that. Message lookups by ID accept up to 100 per request.

http
# What a Sprout Public API call looks like (from Sprout's own docs at api.sproutsocial.com/docs).
# Every call is scoped to YOUR customer ID and to profiles connected to your Sprout account.
POST https://api.sproutsocial.com/v1/<customer_id>/analytics/profiles
Authorization: Bearer <OAuth access token OR API token>
Content-Type: application/json

{
  "filters": [
    "customer_profile_id.eq(<your connected profile ids>)",
    "reporting_period.in(<start>...<end>)"
  ],
  "metrics": ["lifetime_snapshot.followers_count", "net_follower_growth",
              "impressions", "likes", "comments_count", "shares_count",
              "post_link_clicks"]
}

# Limits (Sprout docs): 60 requests per minute, 250,000 requests per month,
# up to 100 profiles per analytics request, reporting_period up to one year.
02 — Section

Sprout Social API pricing: which plan unlocks it

Sprout does not sell API access on its own, and it does not publish a per-call price. The developer docs state the prerequisite without naming a tier: "Your account needs to be on the appropriate plan which enables API access. If you are unsure, please contact your sales representative or contact support." Sprout's pricing page (sproutsocial.com/pricing) is where the tier shows up.

Sprout planPublished priceAPI access (per the pricing page)
Essentials$79 per seat/month ($99 billed monthly)Not listed
Standard$199 per seat/monthNot listed
Professional$299 per seat/monthNot listed
Advanced$399 per seat/month"The Sprout API and Helpdesk integrations"
EnterpriseCustom (demo)Everything in Advanced, plus more

Sprout's own blog post on its API (sproutsocial.com/insights/sprout-social-api) says the same in plainer words: the Public API "is available to all Advanced Plan customers." The pricing page shows prices under an "Annual billing" heading; only Essentials lists a separate month-to-month price.

Add-ons that change what the API returns. Premium Analytics and Listening "are each available as individual add-ons to the Standard plan and up", and neither add-on price is published (the page routes to "Schedule a demo"). Premium Analytics matters for the API because the X metrics marked "Premium Analytics Required" come back only with it, and Sprout's Tableau connector needs "Premium Analytics add-on along with the Sprout Advanced Plan".

What we could not verify. Sprout's support article on API access (support.sproutsocial.com/hc/en-us/articles/360045006152) returned a browser challenge to every automated fetch this session, so this page relies on the developer docs and the pricing page for the plan requirement. If your contract predates the current plan names, ask Sprout support which tier your seats map to.

03 — Section

Sprout Social API rate limits, auth and the X approval step

Rate limits. The docs list two numbers and no burst allowance: 60 requests per minute and 250,000 requests per month. Over the limit the API answers 429 Too Many Requests. For a reporting job that pulls 100 profiles per analytics call, 60 a minute is plenty; for anything shaped like data collection it is a ceiling.

Authentication. Two options, both sent as Authorization: Bearer <token>. OAuth 2.0 is the recommended path: Sprout issues short-lived JWT access tokens, with the client_credentials grant for machine-to-machine jobs and the authorization code flow for user-based integrations. The alternative is an API token that a user with the API Permissions permission generates under Settings > Global Features > API.

The X-specific gate. Before any X data comes through, a Sprout user with API permissions has to accept the "Sprout API X Content End User License Agreement", and the metrics section adds that "Customers are required to undergo a brief X review and approval process before being able to access their X data through the Sprout Analytics API." Plan the approval into your timeline; Sprout's docs mention the case where "X does not approve your specific use case".

DimensionSprout Social Public APITwitterAPI.io (X data)
Rate limit60 requests/min, 250,000/month0.2 req/s before first payment, 20 req/s paid, 50 on Scale, 500 on Business
AccessAdvanced plan or above, API permission, ToS + X EULA, X reviewAPI key from the dashboard; no X account needed for reads
Price modelBundled in a per-seat plan, no per-call price publishedPay only for the data returned: $0.15 per 1,000 posts, $0.18 per 1,000 profiles
ScopeProfiles connected to your Sprout accountAny public X profile, timeline, search, followers
04 — Section

The gap: Sprout's API is not a Twitter (X) data API

Teams usually hit the gap with one of three requests. Each needs data about X accounts that are not connected to your Sprout account, and none of them is answered by an owned-profile API.

"Benchmark us against three competitors, every week, in our own dashboard." Sprout's app has competitor reports (the pricing page lists "extensive competitor, tag and paid insights" on Professional), but the Public API's analytics endpoints filter on your own customer_profile_id values. A competitor's handle is not a profile you can connect, so its posts and engagement do not come back through the API.

"Track every post that mentions our product on X." That is Listening, and Sprout's docs list "Listening data from X" as not included in the API. So X mentions cannot be exported through the API.

"Pull the followers of an account, or search X for a keyword." No endpoint in the Sprout API returns follower lists or arbitrary search results. Those are X data operations, which is what X's own API and third-party X data APIs exist for.

When Sprout remains the right tool. If the job is publishing, inbox, care cases and reporting across Facebook, Instagram, LinkedIn, TikTok, Pinterest and YouTube as well as X, Sprout's multi-network suite remains a fit, and its API is how you get that owned data into a warehouse. Impressions and link clicks for your own posts also only exist in owner-side analytics; no public data source returns them.

When a pay-per-call X data API fits. Anything about accounts you do not own: competitor cadence and engagement, mention streams, keyword searches, follower lists, historical timelines. With TwitterAPI.io those are plain GET requests (/twitter/user/info, /twitter/user/last_tweets, /twitter/tweet/advanced_search, /twitter/user/followers, /twitter/user/mentions) billed per result, with no seat and no plan gate. The study below is exactly that kind of job.

05 — Section

Study: the numbers a Sprout report gives vs what you can compute for any brand

We pulled the public profile and the 100 most recent posts (replies excluded) of 13 brand accounts with 84M followers between them, then computed what a social team usually wants from a competitor benchmark: posting cadence, median public engagements per post (likes + reposts + replies + quotes, reposts excluded because their counters belong to the original post) and engagement per post per 1,000 followers. Sprout's and Hootsuite's own accounts are in the set.

AccountFollowersPosts per weekMedian engagements per postPer 1,000 followers
@Duolingo1.0M7.22,6852.559
@NotionHQ0.5M33.42620.492
@Shopify0.5M3.41560.341
@Airbnb0.8M0.62340.278
@Starbucks9.6M0 (silent 90 days)2,2350.234
@Wendys3.5M3.25760.162
@Canva0.3M5.5490.144
@Nike9.5M0.31,2040.127
@Adobe1.0M0.21010.106
@netflix29.3M112.82,9820.102
@SproutSocial0.1M0 (silent 90 days)40.034
@Spotify21.8M24.96460.030
@hootsuite6.1M0.7230.004

The spread is the story. Median engagement per post per 1,000 followers ranges from 2.559 for @Duolingo to 0.004 for @hootsuite, a 640x gap. Raw follower count predicts little: @netflix has 29.3M followers and a median of 2,982 engagements per post, while @Duolingo, with 1.0M, gets 2,685.

Cadence varies by two orders of magnitude. The median account posted 3.2 times a week over the last 90 days; @netflix posted 113 a week, @NotionHQ 33.4 (59% of its sample were reposts). Two of the 13, @Starbucks and @SproutSocial itself, posted nothing in the last 90 days: their latest posts were 619 and 119 days old at collection time.

Views tell a second story. The public viewCount lets you compute engagements per 1,000 views for any account, a rough public stand-in for Sprout's engagement rate per impression: @Duolingo's median was 15.43, @hootsuite's 2.05. It is not the same metric (Sprout's impressions come from X's owner-side analytics and its engagements include link clicks), so use it for comparing accounts, not for matching a Sprout report.

Horizontal bar chart, log scale: median public engagements per post per 1,000 followers for 13 brand accounts. @Duolingo leads at 2.559, followed by @NotionHQ 0.492 and @Shopify 0.341; @SproutSocial is at 0.034, @Spotify 0.030 and @hootsuite last at 0.004.
Median public engagements per post per 1,000 followers, 13 brand accounts, 100 recent posts each, collected in 2026. A 640x spread; orange bars are the two social-suite vendors' own accounts.
06 — Section

Owned metrics vs public metrics: what each source can give you

The fair comparison is not "Sprout vs raw data" but which metrics live where. Owner-side analytics see things the public never does; public data covers every account, not just yours.

MetricSprout API (your connected profiles)Public X data (any account)
Followers, posts sentYes (lifetime_snapshot.followers_count, posts_sent_count)Yes (followers, statusesCount from /twitter/user/info)
Net follower growthYes, dailyYes, if you snapshot followers daily ($0.18 per 1,000 profiles)
Likes, replies, reposts per postYesYes (likeCount, replyCount, retweetCount, quoteCount)
Views per postVideo views; media views with Premium AnalyticsviewCount on every post
Impressions, link clicks, profile clicksYes (some need Premium Analytics)No: owner-only analytics
Competitor accountsNo (analytics filter on your profiles)Yes, same calls as your own account
X mentions and keyword searchNo ("Listening data from X" excluded)Yes (/twitter/user/mentions, /twitter/tweet/advanced_search)
Follower listsNoYes (/twitter/user/followers, about 200 per page)

Practical split. Keep Sprout (or any owned-analytics source) for impressions and clicks on your own posts, and pull the public layer for your own account and every competitor from an X data API, so the benchmark compares like with like. In our study, a full re-pull of one competitor (profile plus 100 posts) costs $0.01518.

Horizontal bar chart, log scale: posts per week over the last 90 days for 13 brand accounts. @netflix 112.8, @NotionHQ 33.4, @Spotify 24.9, @Duolingo 7.2; @SproutSocial and @Starbucks posted nothing in 90 days. Side columns show days since the last post and the share of reposts.
Posts per week over the last 90 days (or the shorter span 100 posts cover), 13 brand accounts, collected in 2026. Median 3.2 a week; 2 of 13 accounts were silent.
07 — Section

A Sprout Social API alternative for X data: cost and code

A pay-per-call X data API is not a replacement for Sprout's publishing, inbox or multi-network reporting, and this page does not pretend it is. It replaces the part Sprout's API does not do: reading X itself. The costs below use TwitterAPI.io's published per-result prices and X's own pay-per-usage rate card (docs.x.com/x-api/getting-started/pricing).

JobTwitterAPI.ioOfficial X API pay-per-usage
1,000 posts read$0.15$5.00 ($0.005 per post read)
1,000 profiles read$0.18$10.00 ($0.010 per user read)
This study (1,300 posts + 13 profiles)$0.20$6.63
Track all 13 accounts daily for a monthabout $0.23 (780 requests)Billed per post and per user read

Per 1,000 posts that is $5 on X's rate card against $0.15 here, about 33x. X's pay-per-usage plan is also capped at 3 million post reads per monthly billing cycle, with Enterprise above that; new X API customers get $20 in credits on a first eligible card and a match of the first auto-recharge up to $50.

How the monthly figure is built. One /twitter/user/last_tweets call and one /twitter/user/info call per account per day. A day with no new post still costs the 15-credit request minimum ($0.00015), and a full 20-post page costs $0.003. At the cadences we measured, timelines come to $0.16 a month and daily profile snapshots (which give you net follower growth) $0.07.

Getting started. New accounts that pass the automatic bot check get up to $1 of free credits (at most 100,000 credits, no card, one per person or network, expiring after 31 days). Purchased credits never expire; $1 = 100,000 credits. Subscriptions start at Starter $29 a month (then Builder $99, Pro $199, Scale $499, Business $1,499) for teams that want higher rate limits; see the pricing page for what each includes.

The script in the code block at the end of this page is the study above in about 80 lines: one /twitter/user/info call per handle (followers), up to five /twitter/user/last_tweets pages of 20 posts (cadence and engagement), then the same medians we report. It reads only the fields the API returns: followers, userName, createdAt, likeCount, retweetCount, replyCount, quoteCount, viewCount, plus has_next_page and next_cursor for paging.

Two details that bite. An unknown handle does not return 404: /twitter/user/info answers HTTP 200 with status: "error" and msg: "user not found", so check status before reading data. And skip reposts when measuring engagement: a repost's counters belong to the reposted post, which would credit a brand with someone else's reach.

Where to put it. Run it on a daily schedule and append rows to the same table your Sprout API export lands in, keyed by handle and date. Your own account then has both layers (owner-side impressions from Sprout, public engagement from X), and competitors have the public layer, which is the only one anyone outside those companies can see.

If you also publish. Posting to X through TwitterAPI.io is a separate, authenticated flow: one /twitter/user_login_v2 login ($0.10, with a proxy you supply) returns login_cookies, then each post via /twitter/create_tweet_v2 costs $0.002. Those calls act as that account, so X can rate-limit, lock or suspend it; keep a human pace, expect the session to need re-login occasionally, and note that billing is per HTTP 200 call.

08 — Section

Hootsuite API: the same owned-data shape

"Hootsuite API" searches land on the same question, and the answer has the same shape. Hootsuite's developer docs (developer.hootsuite.com) describe a REST API with OAuth 2.0 that "operates on the same data" as the Hootsuite dashboard. Access needs an active Hootsuite user and an approved Developer account.

What it covers. A Publishing API that schedules posts with media (TikTok, YouTube and Bluesky are listed as not supported), a User Management API using SCIM, an Ow.ly link API for Enterprise users only, the Amplify employee-advocacy API, Inbox 2.0 APIs, and an Analytics API marked "New for April 2026" that returns posts with lifetime metrics and daily profile metrics. Using the Analytics API requires the user to have purchased the Advanced Analytics add-on and the app to request the analytics:read scope; its list endpoints accept a lastModified at most 30 days in the past.

Rate limits. Hootsuite's REST APIs allow 20 requests per second up to 100,000 calls per day, reported in X-Account-Quota headers, with 429 on overflow.

The same gap. Like Sprout's, Hootsuite's API works on the social profiles connected to a Hootsuite account. It is a way to automate Hootsuite, not a way to read arbitrary X profiles, timelines, followers or search results. If the reason you looked up either API is X data about accounts you do not own, the X data path in this page applies to both.

09 — Section

How we collected this

Question. For a set of public brand accounts, what can anyone compute from raw X data (followers, posting cadence, public engagement per post and per 1,000 followers, views), and which owner-side numbers in a Sprout report can public data not reproduce?

Accounts. @Wendys, @Duolingo, @netflix, @Spotify, @Nike, @Starbucks, @Airbnb, @Adobe, @Canva, @NotionHQ, @Shopify, @SproutSocial and @hootsuite: 13 organization accounts chosen as recognizable brands with active social teams, plus the two social-suite vendors.

Window and sample. Collected in 2026. One /twitter/user/info call and five pages of /twitter/user/last_tweets (replies excluded, newest first) per account: 1,300 posts and 13 profiles in 78 requests, $0.20 at list prices. Each account's window is the span its 100 most recent posts cover, from 6.2 days (@netflix) to 903 days (@Adobe). Posts per week use the last 90 days, or the shorter span when 100 posts do not reach back that far.

What the sample cannot show. Impressions, link clicks and profile clicks are owner-only analytics, so we cannot reproduce Sprout's engagement rate per impression; viewCount is a public proxy, not the same number. Engagement counts are cumulative at collection time, so the newest posts are still accruing. 100 posts is a recent snapshot, not a year of history, and 13 brands are not a representative sample of all brands.

Privacy. Aggregates only, organization accounts only; no reposted, quoted or replying authors are analyzed. Raw pages are kept compressed for audit because every account is an organization account.

python
"""competitor_benchmark.py - the public X numbers Sprout's API cannot give you for
profiles you do not own: followers, posting cadence and engagement per post, for any
list of public brand accounts.

    pip install requests
    export TWITTERAPI_IO_API_KEY=...   # from the twitterapi.io dashboard
    python3 competitor_benchmark.py Wendys Duolingo Canva
"""
import os
import statistics
import sys
from datetime import datetime, timezone

import requests

BASE = "https://api.twitterapi.io"
HEADERS = {"X-API-Key": os.environ["TWITTERAPI_IO_API_KEY"]}
POSTS_PER_ACCOUNT = 100   # 5 pages of 20; $0.15 per 1,000 posts returned


def profile(handle):
    r = requests.get(f"{BASE}/twitter/user/info", headers=HEADERS,
                     params={"userName": handle}, timeout=30)
    r.raise_for_status()
    body = r.json()
    if body.get("status") != "success" or not body.get("data"):
        raise ValueError(f"@{handle}: {body.get('msg')}")   # unknown user -> 200 + status "error"
    return body["data"]


def recent_posts(handle, limit=POSTS_PER_ACCOUNT):
    posts, cursor = [], ""
    while len(posts) < limit:
        r = requests.get(f"{BASE}/twitter/user/last_tweets", headers=HEADERS,
                         params={"userName": handle, "cursor": cursor}, timeout=30)
        r.raise_for_status()
        body = r.json()
        posts += (body.get("data") or {}).get("tweets") or []
        if not body.get("has_next_page") or not body.get("next_cursor"):
            break
        cursor = body["next_cursor"]
    return posts[:limit]


def created(t):
    return datetime.strptime(t["createdAt"], "%a %b %d %H:%M:%S %z %Y")


def engagements(t):
    return sum(t.get(k) or 0 for k in ("likeCount", "retweetCount", "replyCount", "quoteCount"))


def benchmark(handle):
    user = profile(handle)
    posts = recent_posts(handle)
    own = [t for t in posts if not t.get("retweeted_tweet")]   # repost counters belong to the original
    times = sorted(created(t) for t in posts)
    now = datetime.now(timezone.utc)
    last_90 = [x for x in times if (now - x).days < 90]
    eng = [engagements(t) for t in own]
    followers = user.get("followers") or 0
    med = statistics.median(eng) if eng else 0
    return {
        "account": "@" + user["userName"],
        "followers": followers,
        "posts_per_week_90d": round(len(last_90) / (90 / 7), 1),
        "days_since_last_post": (now - times[-1]).days if times else None,
        "median_engagements": med,
        "per_1k_followers": round(med / followers * 1000, 3) if followers else None,
        "median_views": statistics.median([t.get("viewCount") or 0 for t in own]) if own else 0,
    }


if __name__ == "__main__":
    handles = sys.argv[1:] or ["Wendys", "Duolingo", "Canva"]
    rows = [benchmark(h) for h in handles]
    rows.sort(key=lambda r: -(r["per_1k_followers"] or 0))
    print(f"{'account':16} {'followers':>11} {'posts/wk':>9} {'last post':>10} {'med eng':>8} {'per 1k':>7}")
    for r in rows:
        print(f"{r['account']:16} {r['followers']:>11,} {r['posts_per_week_90d']:>9} "
              f"{str(r['days_since_last_post']) + ' d':>10} {r['median_engagements']:>8} {r['per_1k_followers']:>7}")
10 — Questions

Questions readers ask

Does Sprout Social have an API?

Yes. The Sprout Public API at api.sproutsocial.com exposes your own Sprout data: owned profile analytics, post analytics, inbox messages, Listening topics, cases, publishing and media upload. Requests use /v1/<customer_id>/ paths and a Bearer token (OAuth 2.0 or an API token).

Which Sprout Social plan includes API access?

Sprout's pricing page lists "The Sprout API" under the Advanced plan ($399 per seat per month, annual billing), and Enterprise includes everything in Advanced. The developer docs say only that your account must be on a plan that enables API access and point to sales or support if unsure.

How much does the Sprout Social API cost?

Sprout does not publish a separate API price or a per-call rate. Access comes with the plan (Advanced or Enterprise). Premium Analytics, required for some X metrics, and Listening are add-ons whose prices are not published.

What are the Sprout Social API rate limits?

60 requests per minute and 250,000 requests per month, per Sprout's docs. Analytics requests take up to 100 profiles each with a reporting period of at most one year; over the limit the API returns 429 Too Many Requests.

Can I get competitor or Twitter (X) listening data from the Sprout API?

No. Analytics endpoints filter on profiles connected to your account, and Sprout's docs list "Listening data from X" as not included. For competitor posts, mentions, keyword search or follower lists on X, use an X data API; with TwitterAPI.io that is $0.15 per 1,000 posts returned.

Do I need X approval to get X data through Sprout?

Yes. A user with API permissions must accept the Sprout API X Content End User License Agreement, and Sprout's docs say customers undergo a brief X review and approval process before X data is available through the Sprout Analytics API.

Is there a Hootsuite API?

Yes. Hootsuite offers REST APIs with OAuth 2.0 for publishing, user management (SCIM), Ow.ly links (Enterprise only), Amplify, Inbox 2.0 and an Analytics API that requires the Advanced Analytics add-on. Limits are 20 requests per second and 100,000 calls per day. Like Sprout's, it works on profiles connected to your account.

What is a Sprout Social API alternative for X data?

A pay-per-call X data API. TwitterAPI.io reads any public X profile ($0.18 per 1,000), timeline or search ($0.15 per 1,000 posts returned) with an API key and no X account. It does not replace Sprout's publishing or multi-network reporting; it covers the X data Sprout's API does not return.

11 — Further reading

Continue

Sources & further reading
More from this series
Build it

Stop reading. Start building.

Starter credits cover real testing on real data. Google sign-in, no card, no application queue.

Get an API key