> ## Documentation Index
> Fetch the complete documentation index at: https://docs.social-api.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Plans & Limits

> Resource limits, billing periods, export quotas, and how to monitor your usage.

## How plans work

[SocialAPI.AI](https://social-api.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.ai](https://app.social-api.ai) → **Billing**. Compare every tier on the [plans and pricing](https://social-api.ai/pricing) page.

<Note>
  **All plans include managed platform apps** for Meta (Instagram, Facebook, Threads), Google, TikTok, LinkedIn, and YouTube - no developer registration or app review on your side. Twitter is BYOK on every plan ([setup guide](/connectors/twitter-byok)). See [Platform credentials](/guides/platform-credentials) for details.
</Note>

## Plan catalog endpoint

To read the full plan catalog programmatically instead of hardcoding the table below, call:

```bash theme={null}
curl https://api.social-api.ai/v1/billing/plans \
  -H "Authorization: Bearer $SOCIALAPI_KEY"
```

The response lists every tier, ordered cheapest to most expensive, with its display metadata, prices, and resource limits (trimmed to two plans here):

```json theme={null}
{
  "plans": [
    {
      "tier": "free",
      "name": "Hobby",
      "tagline": "Kick the tires, no card required",
      "monthly_price_usd": 0,
      "annual_price_usd": 0,
      "popular": false,
      "limits": {
        "profiles": 2,
        "posts_per_month": 10,
        "interactions_per_month": 50,
        "storage_bytes": 104857600,
        "event_retention_days": 1,
        "exports_per_month": 2
      }
    },
    {
      "tier": "pro",
      "name": "Full Send",
      "tagline": "For growing teams and products",
      "monthly_price_usd": 109,
      "annual_price_usd": 1044,
      "popular": true,
      "limits": {
        "profiles": 50,
        "posts_per_month": -1,
        "interactions_per_month": -1,
        "storage_bytes": -1,
        "event_retention_days": 30,
        "exports_per_month": 20
      }
    }
  ]
}
```

`profiles` is the count of social profiles (brands) the plan allows. Prices are in USD. A value of `-1` means unlimited for any field under `limits`, and custom pricing for `monthly_price_usd` / `annual_price_usd` (shown on the Enterprise tier). `popular` flags the tier highlighted by default on pricing surfaces.

## Plan limits

| Plan       | Display Name | Brands    | Posts / month | Interactions / month | Storage   | Price  |
| ---------- | ------------ | --------- | ------------- | -------------------- | --------- | ------ |
| Free       | Hobby        | 2         | 10            | 50                   | 100 MB    | \$0    |
| Starter    | Side Hustle  | 10        | Unlimited     | Unlimited            | Unlimited | \$29   |
| Pro        | Full Send    | 50        | Unlimited     | Unlimited            | Unlimited | \$109  |
| Business   | Empire       | 200       | Unlimited     | Unlimited            | Unlimited | \$349  |
| Enterprise | Enterprise   | Unlimited | Unlimited     | Unlimited            | Unlimited | Custom |

## Export and analytics limits

Each plan includes different export quotas for analytics reports.

| Feature                    | Free   | Starter   | Pro       | Business  | Enterprise |
| -------------------------- | ------ | --------- | --------- | --------- | ---------- |
| Exports per month          | 2      | 10        | 20        | Unlimited | Unlimited  |
| Max videos per export      | 30     | 200       | 500       | Unlimited | Unlimited  |
| Max transcripts per export | 10     | Unlimited | Unlimited | Unlimited | Unlimited  |
| Vision analysis            | No     | Yes       | Yes       | Yes       | Yes        |
| Event retention (days)     | 1      | 7         | 30        | 90        | 90         |
| Report expiry (days)       | 7      | 30        | 30        | 90        | 90         |
| Export cooldown            | 7 days | 24 hours  | 1 hour    | 1 hour    | None       |

<Note>
  "Unlimited" in the table above means the feature is not capped. In the API response, unlimited values are represented as `-1`.
</Note>

## What counts as a post or interaction

**Post operations** (each consumes 1 post from your monthly allowance):

* `create_post` - publishing or scheduling a new post (saving a **draft** is free; the credit is charged when you publish it)
* `publish_post` - publishing an existing draft or scheduled post (`POST /v1/posts/{pid}/publish`)
* `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.

<Note>
  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.
</Note>

## 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`:

```json theme={null}
{
  "error": {
    "code": "validation.post_limit_exhausted",
    "message": "Monthly post limit exhausted"
  },
  "request_id": "a1b2c3d4"
}
```

The interaction-limit response uses the same shape with `error.code` set to `validation.interaction_limit_exhausted`. Your counters reset at the start of your next billing period. To get more capacity immediately, upgrade your plan.

<Note>
  The `billing.post_limit` code is emitted by the bulk-import endpoint (`POST /v1/posts/import`) when the batch size exceeds your remaining post allowance.
</Note>

When you exceed your storage quota, the API returns HTTP `413`:

```json theme={null}
{
  "error": {
    "code": "billing.storage_quota",
    "message": "Storage quota exceeded. Free plan is limited to 100MB. Upgrade your plan for more storage."
  },
  "request_id": "a1b2c3d4"
}
```

## Checking your usage

```bash theme={null}
curl https://api.social-api.ai/v1/usage \
  -H "Authorization: Bearer $SOCIALAPI_KEY"
```

```json theme={null}
{
  "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

```bash theme={null}
curl https://api.social-api.ai/v1/media/storage \
  -H "Authorization: Bearer $SOCIALAPI_KEY"
```

```json theme={null}
{
  "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:

| Header                     | Description                             |
| -------------------------- | --------------------------------------- |
| `X-Posts-Limit`            | Monthly post limit for your plan        |
| `X-Posts-Remaining`        | Posts remaining this period             |
| `X-Interactions-Limit`     | Monthly interaction limit for your plan |
| `X-Interactions-Remaining` | Interactions remaining this period      |
| `X-Storage-Used`           | Current storage usage in bytes          |
| `X-Storage-Limit`          | Storage limit in bytes for your plan    |

<Tip>
  These headers are only set for Free plan post/interaction operations. Paid plans with unlimited resources omit them.
</Tip>

## 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:

```json theme={null}
{
  "error": {
    "code": "platform.instagram.rate_limit",
    "message": "platform rate limit exceeded"
  },
  "request_id": "a1b2c3d4"
}
```

The `instagram` segment is replaced with the actual platform name (`facebook`, `tiktok`, etc.). Match on the `platform.*.rate_limit` shape to handle all platforms.

This does **not** consume your post or interaction quota. Retry after a short wait (typically a few minutes).

### Platform publishing ceilings

Each platform sets its own publishing limits, which apply in addition to your plan quota. These are the platforms' own published figures:

| Platform                | Publishing ceiling (set by the platform)                                                                                                 |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Instagram               | 25 posts per 24 hours                                                                                                                    |
| Threads                 | 250 posts and 1,000 replies per 24 hours                                                                                                 |
| YouTube                 | A daily upload quota (Google's default is 10,000 quota units per day, roughly 100 video uploads per day), reset at midnight Pacific time |
| Google Business Profile | 300 requests per minute per API, and about 10 edits per location per minute                                                              |
| Facebook, X             | Enforced per app and per user through limits the platform reports in response headers; there is no single fixed number                   |

We monitor each platform's reported usage and pace requests to stay within the platform's ceiling. SocialAPI itself adds no per-request throttle beyond your monthly plan quota, and read operations (inbox, reviews, comments) are not throttled on our side. If you run scheduled, unattended publishing across many accounts, design against the platform ceilings above.

## Handling 429s

```python theme={null}
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")
```

<Note>
  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.
</Note>
