Sprout Social gates its public API to the Advanced plan. Sprout's pricing page prints Advanced at "$399 per seat/month" and lists "The Sprout API and Helpdesk integrations" among the things Advanced adds on top of Professional. Nothing on that page prices the API separately, and no per-call fee is published. Checked on sproutsocial.com/pricing, 4 August 2026.
Paying for the seat is one of three gates, and it is the only one a credit card clears. Sprout's developer docs list the other two: "Users need to have the API Permissions permission in order to manage the configurations for API access" and "accept Sprout's Analytics API Terms of Service". An Advanced seat without that entitlement cannot mint a token.
What the Sprout Social API exposes
The API is versioned at /v1 and splits into six families: customer metadata, analytics, messages, Listening, cases, and publishing. Reads are POST requests carrying a JSON body, not GET with query strings. POST /v1/<customer id>/analytics/posts is a read. So is POST /v1/<customer id>/messages. Plan your HTTP client and your caching layer around that, because plenty of tooling assumes POST means write.
curl -X POST 'https://api.sproutsocial.com/v1/<customer id>/analytics/posts' \
-H 'Authorization: Bearer <token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"fields": ["created_time", "perma_link", "text", "internal.tags.id"],
"filters": [
"customer_profile_id.eq(1234, 5678, 9012)",
"created_time.in(2020-04-06T00:00:00..2020-04-19T23:59:59)"
],
"metrics": ["lifetime.impressions", "lifetime.reactions"],
"timezone": "America/Chicago",
"page": 1
}'The filter grammar is Sprout's own: strings shaped field.op(args) inside a filters array. customer_profile_id.eq(1234, 5678, 9012) selects profiles, created_time.in(...) bounds the window, and post_type.eq(TWEET,FACEBOOK_POST,INSTAGRAM_DIRECT_MESSAGE) narrows message types. Those exact strings are the docs' own examples. You are writing against a small query language rather than URL parameters.
Analytics carries hard ceilings worth designing around. Profile analytics accepts at most 100 profiles per request and a date range of at most one year. Post analytics also caps at 100 profiles, defaults to 50 results per page, and stops at 10,000 results for a single query. Push a client roster past that and your backfill becomes a scheduling problem, which is the pattern we walk through in social media analytics API.
Which plan unlocks API access
Advanced. Sprout's pricing page files it under "Everything in Professional, plus:", where the API sits beside sentiment in the Smart Inbox, team productivity reports, and message spike alerts. Professional at "$299 per seat/month" does not list it. Neither does Standard at "$199 per seat/month", nor Essentials, which prints "$79 per seat/month" annually and "$99 per seat/month billed monthly".
The page states "Annual billing", and only Essentials prints a second, higher monthly figure. Treat the other three as annual-commitment prices until a Sprout rep says otherwise. Enterprise is "Custom" and covers "Everything in Advanced, plus:" white-glove onboarding and SSO setup, so API access travels upward with the tier. Seat count is the multiplier on your bill, and the pricing page never defines a seat.
| Endpoint group | Example path | Plan that unlocks it | Extra gate |
|---|---|---|---|
| Customer metadata | GET /v1/metadata/client | Advanced | API Permissions plus Analytics API ToS |
| Profile and post analytics | POST /v1/<id>/analytics/posts | Advanced | Max 100 profiles per request |
| Messages | POST /v1/<id>/messages | Advanced | A group_id filter is required |
| Listening topics | POST /v1/<id>/listening/topics/<topic id>/messages | Advanced, plus Listening (not documented) | Listening is a paid add-on, priced by demo |
| Cases | POST /v1/<id>/cases/filter | Advanced | At least one filter; date ranges max one week |
| Publishing and media | POST /v1/<id>/publishing/posts | Advanced | is_draft must be true |
One row needs its caveat spelled out. Sprout's pricing page says "Premium Analytics and Listening are each available as individual add-ons to the Standard plan and up", both priced "Schedule a demo". The Listening endpoints read Topics, and Topics come from that add-on. Sprout's API docs never state the dependency, so confirm it with your rep before quoting a Listening integration to a customer.
The permission gate catches teams more often than the plan gate does. API Permissions is granted per user by an Account Owner, and tokens live under the Sprout app's global settings rather than in a separate developer portal. Authentication is Authorization: Bearer <token>, carrying either an account-scoped API token or an OAuth 2.0 client_credentials exchange that returns short-lived JWTs.
The Sprout Social data model: profiles, posts, and messages
Three nouns carry the whole model: customer, profile, and message. A customer is your Sprout account. A profile is one connected social account inside it. A message is anything published by or received on those profiles. Posts are the subset of messages with lifetime metrics attached, which is why post analytics and message retrieval share so much filter vocabulary.
Sprout's metadata endpoints hand you the identifiers every other call filters on. GET /v1/metadata/client returns the customer IDs your token can see; the customer-scoped metadata endpoints return customer_profile_id and group_id values.
A profile object carries customer_profile_id, network_type, name, native_name, native_id, groups, and an optional network_metadata. Two of those matter downstream. Every analytics and message filter keys on customer_profile_id, while native_id is the platform's own identifier. Store both. Mapping Sprout IDs back to native IDs is the join you will want the first time a customer asks why a number differs from Instagram's own dashboard.
{
"filters": [
"group_id.eq(12345)",
"customer_profile_id.eq(1234, 5678, 9012)",
"created_time.in(2020-04-06T00:00:00..2020-04-19T23:59:59)",
"post_type.eq(TWEET,FACEBOOK_POST,INSTAGRAM_DIRECT_MESSAGE)"
],
"fields": [
"network", "created_time", "post_category", "post_type",
"perma_link", "text", "from", "profile_guid",
"internal.tags.id", "internal.sent_by.email"
],
"sort": ["created_time:desc"],
"limit": 50,
"timezone": "America/Chicago",
"page_cursor": "123abc=="
}group_id is mandatory on the messages endpoint, which trips anyone who models the integration around profiles alone. post_type is an enum spanning TWEET, FACEBOOK_POST, INSTAGRAM_MEDIA, INSTAGRAM_DIRECT_MESSAGE, TWITTER_DIRECT_MESSAGE and more across X, Facebook, Instagram, LinkedIn, YouTube, Pinterest, TikTok, Bluesky and Threads. Sprout's changelog added TIKTOK_POST_MENTION and TIKTOK_COMMENT_MENTION on 10 June 2026, so treat the enum as moving.
Rate limits and pagination on the Sprout API
Two ceilings, and the binding one is not the one most teams plan against. The docs state 60 requests per minute and 250,000 requests per month. Sixty a minute sustained for thirty days would be 2.59 million calls, so the monthly quota bites roughly ten times harder. Averaged out, 250,000 a month is about 5.8 requests per minute, or 8,333 a day.
Exceeding either returns 429, described in the docs as "The client is making requests too quickly or has exhausted the allowed requests in a month". Sprout documents no Retry-After header. The instruction is to slow down, so your client needs both its own backoff and its own monthly budget counter, because those two 429s call for completely different responses.
Pagination differs across the surface, so read each endpoint's own section. Messages default to 50 results, cap at 100 per response, use a cursor, and move forward only: the docs say pagination "only supports fetching the 'next' page of data". Profile analytics defaults to 1,000 per page. Post analytics defaults to 50 and refuses to return more than 10,000 results for one query.
What the API does not give you
Sprout publishes its own exclusion list, which is more useful than any feature matrix. Three items are marked as not currently supported: "Paid (Ad Account) data", "Listening data from X", and "Listening message-level data from Reddit". That Reddit line landed on 12 May 2026, after a Reddit compliance change, per Sprout's changelog.
- Review data from Yelp, Trustpilot, TripAdvisor and Glassdoor is unavailable through the public API on legal and partnership grounds, and stays inside the Sprout app.
- Google My Business post types are limited to the last 30 days to comply with Google's terms of service.
- Direct message media is broken by design: text and metadata come through, but the docs state that "Media URLs returned for images or videos in DMs are nonfunctional".
- Publishing writes drafts and stops there. The docs put it plainly: "Only posts created in draft status are supported at this time".
That last line reshapes what you can build on top. POST /v1/<customer id>/publishing/posts takes is_draft: true and covers Instagram Business and Creator, Facebook Pages, Threads, X, LinkedIn Pages and Personal, YouTube, TikTok, Pinterest and Google My Business. A human still opens Sprout and hits publish. No endpoint sends or replies to a message either, so two-way conversation handling stays in the app.
Sprout's API reads almost everything and writes almost nothing: drafts only, no sends, no replies.
None of this is a defect. Sprout is a suite with an analytics API attached, and the exclusions track what its network partnerships permit. It does mean a product plan of the shape "our app posts and replies through Sprout" will not survive contact with the documentation. Read the exclusion list before the endpoint list.
Deciding whether the Sprout API fits your build
The decision rule is short. If your team already pays for Advanced seats and you want Sprout's own reporting numbers in a warehouse or a customer dashboard, the API is the sanctioned route, and 250,000 calls a month is generous for that job. If you need programmatic publishing, DM sending, or review replies, the surface does not reach, and the price scales with headcount rather than with the number of brands you serve.
Costing that against direct platform integrations is a separate exercise, and we ran those numbers in social media API integration. If what you actually want is the head-to-head, the SocialAPI.ai vs Sprout Social comparison is the page for it. For reference, SocialAPI.ai bills per brand rather than per seat, from $0 to $349 a month across 9 platforms.
Questions developers ask about the Sprout Social API
- Which Sprout Social plan includes API access?
- The Advanced plan. Sprout's pricing page lists "The Sprout API and Helpdesk integrations" under Advanced, printed at $399 per seat/month with annual billing, and does not list API access on Essentials, Standard or Professional. Enterprise is custom-priced and covers everything in Advanced. Beyond the plan, Sprout's documentation requires the API Permissions entitlement on the user and acceptance of the Analytics API Terms of Service. Verified on sproutsocial.com/pricing and api.sproutsocial.com/docs on 4 August 2026.
- Does the Sprout Social API cost extra?
- Sprout publishes no separate API price, no per-call fee, and no API add-on on its pricing page. The cost of access is the Advanced seat price itself, $399 per seat/month, multiplied by however many seats your contract carries. The pricing page never defines what a seat is and states no minimum seat count, so confirm both with a sales rep before you budget. Checked 4 August 2026.
- What are the Sprout Social API rate limits?
- 60 requests per minute and 250,000 requests per month, both stated in Sprout's API documentation. Exceeding either returns HTTP 429, which the docs describe as the client "making requests too quickly or has exhausted the allowed requests in a month". No Retry-After header is documented. Watch the asymmetry: 60 per minute sustained across a month would be roughly 2.59 million calls, so the monthly quota is the ceiling that actually binds.
- Can you publish posts through the Sprout Social API?
- Only as drafts. The publishing endpoint states that "Only posts created in draft status are supported at this time", so a request creates a draft inside Sprout that a person then publishes from the app. Draft creation covers Instagram Business and Creator, Facebook Pages, Threads, X, LinkedIn Pages and Personal, YouTube, TikTok, Pinterest and Google My Business. There is no endpoint for sending or replying to a message.
- What data is missing from the Sprout Social API?
- Sprout lists paid (Ad Account) data, Listening data from X, and Listening message-level data from Reddit as not currently supported. Review data from Yelp, Trustpilot, TripAdvisor and Glassdoor is unavailable through the public API on legal and partnership grounds. Google My Business post types are capped at the last 30 days to comply with Google's terms. Direct message text and metadata are retrievable, but the docs warn that media URLs returned for images or videos in DMs are nonfunctional.
- How do you authenticate with the Sprout Social API?
- With an Authorization: Bearer header carrying either an account-scoped API token or an OAuth 2.0 access token. Tokens are created inside the Sprout app by any user holding the API Permissions permission, and the same settings page lets you view or invalidate existing tokens. The OAuth path uses a client_credentials grant against Sprout's identity service and returns short-lived JWTs. The documentation does not publish the JWT lifetime.
Every figure above came from Sprout's own pages on 4 August 2026, and Sprout can change any of them without notice. If a number here disagrees with what your Sprout rep quotes, believe the rep and tell us so we can correct the post.
All sources, retrieved 4 August 2026: Sprout Social pricing page · Sprout Social API documentation · Sprout Social API changelog · SocialAPI.ai pricing
