Skip to main content

How plans work

SocialAPI.AI uses resource-based limits. Every plan gives you a fixed number of brands, posts per month, interactions per month, media storage, and export quotas. A brand groups all social accounts for one business, client, or project. Connect Instagram, TikTok, LinkedIn, and more under one brand, and it counts as one unit. All plans have access to all platforms, DMs, and features. Plans differ only by resource limits. Upgrade at app.social-api.aiBilling.

Plan limits

PlanDisplay NameBrandsPosts / monthInteractions / monthStoragePrice
FreeHobby21050100 MB$0
StarterSide Hustle10UnlimitedUnlimitedUnlimited$29
ProFull Send50UnlimitedUnlimitedUnlimited$109
BusinessEmpire200UnlimitedUnlimitedUnlimited$349
EnterpriseEnterpriseUnlimitedUnlimitedUnlimitedUnlimitedCustom

Export and analytics limits

Each plan includes different export quotas for analytics reports.
FeatureFreeStarterProBusinessEnterprise
Exports per month21020UnlimitedUnlimited
Max videos per export30200500UnlimitedUnlimited
Max transcripts per export10UnlimitedUnlimitedUnlimitedUnlimited
Vision analysisNoYesYesYesYes
Event retention (days)17309090
Report expiry (days)730309090
Export cooldown7 days24 hours1 hour1 hourNone
“Unlimited” in the table above means the feature is not capped. In the API response, unlimited values are represented as -1.

What counts as a post or interaction

Post operations (each consumes 1 post from your monthly allowance):
  • create_post - publishing a new post
  • retry_post - retrying a failed post
Interaction operations (each consumes 1 interaction from your monthly allowance):
  • reply - replying to a comment, review, or mention
  • send_dm - sending a direct message
All other operations are free. Listing accounts, fetching comments, reading DMs, checking usage, managing API keys, and similar read operations do not consume any quota.
Only the Free plan enforces post and interaction limits. All paid plans have unlimited posts and interactions. The counters are tracked but never block requests.

Billing periods

  • Paid plans: Aligned with your Stripe subscription cycle. The period_start and period_end come directly from Stripe.
  • Free plan: Rolling 30-day window from your account creation anniversary date.
Counters reset to zero at the start of each new period.

When you hit a limit

When you exceed your monthly post or interaction allowance, the API returns HTTP 429:
{
  "error": "monthly post limit exceeded for your plan",
  "code": "rate_limit_exceeded"
}
Your counters reset at the start of your next billing period. To get more capacity immediately, upgrade your plan. When you exceed your storage quota, the API returns HTTP 413:
{
  "error": "Storage quota exceeded. Free plan is limited to 100MB. Upgrade your plan for more storage.",
  "code": "storage_quota_exceeded"
}

Checking your usage

curl https://api.social-api.ai/v1/usage \
  -H "Authorization: Bearer $SOCIALAPI_KEY"
{
  "brands_used": 2,
  "brands_limit": 10,
  "posts_used": 7,
  "posts_limit": -1,
  "interactions_used": 23,
  "interactions_limit": -1,
  "period_start": "2026-02-15T00:00:00Z",
  "period_end": "2026-03-15T00:00:00Z"
}
A limit value of -1 means unlimited (all paid plans).

Checking storage usage

curl https://api.social-api.ai/v1/media/storage \
  -H "Authorization: Bearer $SOCIALAPI_KEY"
{
  "used_bytes": 52428800,
  "limit_bytes": 104857600,
  "count": 12
}
A limit_bytes value of -1 means unlimited storage.

Response headers

Post and interaction operations include usage headers in the response:
HeaderDescription
X-Posts-LimitMonthly post limit for your plan
X-Posts-RemainingPosts remaining this period
X-Interactions-LimitMonthly interaction limit for your plan
X-Interactions-RemainingInteractions remaining this period
X-Storage-UsedCurrent storage usage in bytes
X-Storage-LimitStorage limit in bytes for your plan
These headers are only set for Free plan post/interaction operations. Paid plans with unlimited resources omit them.

Platform rate limits

Platforms (Instagram, Facebook, etc.) have their own rate limits independent of your plan limits. When a platform rejects a request due to its own throttling, you receive:
{
  "error": "platform rate limit exceeded",
  "code": "platform_rate_limit"
}
This does not consume your post or interaction quota. Retry after a short wait (typically a few minutes).

Handling 429s

import time
import requests

def call_with_retry(url, headers, max_retries=3):
    for attempt in range(max_retries):
        resp = requests.get(url, headers=headers)
        if resp.status_code == 429:
            time.sleep(2 ** attempt)  # exponential backoff
            continue
        return resp
    raise Exception("rate limit exceeded after retries")
If the rate-limit enforcement backend (Redis) is unavailable, the API fails open. Requests are allowed through rather than blocked. This prevents infrastructure downtime from taking down your integration.