Plan limits, quotas and rate limits
Socifyr limits come from three places: your plan, per-API-key guardrails, and API rate limits. Plan numbers below come from the shared limits table the API enforces, so they match what the dashboard shows. For prices, see the Billing page in the dashboard or socifyr.com/pricing.
What does each plan include?
| Limit | Free | Pro | Business |
|---|---|---|---|
| Posts per month | 30 | Unlimited | Unlimited |
| Connected accounts | 3 | 10 | 40 |
| Posts to X per month | 5 | 50 | 300 |
| Media storage | 1 GB | 50 GB | 500 GB |
| Scheduling | No | Yes | Yes |
| Webhooks | No | No | Yes |
| Webhook endpoints | 0 | 0 | 25 |
| API keys | 1 | 5 | Unlimited |
| Team members (owner counts as one) | 1 | 3 | Unlimited |
| Media library | Yes | Yes | Yes |
| Content history visible | Last 30 days | Full | Full |
Self-hosted installs skip the plan checks.
How are the limits enforced?
- Posts per month. Every create or publish call counts once, however many accounts it targets. Drafts count when they publish. At the limit the API returns
Upload limit reached for your plan. Upgrade to continue.with status 403. - Connected accounts. Checked only when you add a new account. Reconnecting never counts against the cap, and workspaces already over a lowered cap keep their accounts.
- X posts. X bills per post, so the monthly allowance is a hard cap. Over it, posts to X are blocked until the monthly reset. Error:
X (Twitter) post allowance reached (N/month on your plan). ... - Storage. Uploads that would pass the limit fail with
Storage limit reached for your plan. Delete unused media or upgrade to continue. - Scheduling. A request with
scheduledAton the Free plan fails withScheduling is not available on your current plan. Upgrade to continue. - Webhooks. Creating one off Business fails with
Webhooks are not available on your current plan. Upgrade to Business to continue.
All plan blocks return 403, not 402, even though the SDK has a UsageLimitError class for 402.
How do I check my current usage?
socifyr usageconst usage = await socifyr.workspaces.usage()
console.log(usage.tier, usage.uploads, usage.accounts, usage.xPosts, usage.storage)usage = client.usage()curl https://api.socifyr.com/api/usage -H "Authorization: Bearer $SOCIFYR_API_KEY"{ "tool": "get_usage", "arguments": {} }Each dimension (uploads, accounts, xPosts, storage) returns used, limit, remaining and unlimited. limit and remaining are null when unlimited. The response also has tier and xSpendUsd, the estimated X spend this month.
What per-key guardrails exist?
Set on an API key, they apply only to requests using that key.
| Guardrail | Meaning |
|---|---|
dailyPostLimit | Posts per UTC day through the key. |
monthlyXSpendCentsCap | Estimated X spend per month, in US cents. |
requireApproval | Posts wait for a human to approve. |
What are the API rate limits?
| Route group | Limit |
|---|---|
| Most routes | 60 requests per minute |
GET /content, GET /content/:id | 240 per minute |
/ai/* | 10 per minute |
POST /analytics/sync | 5 per 10 minutes |
Hosted MCP endpoint /api/mcp | 120 per minute per IP |
A rate-limited request returns 429. Plan limits are separate.
What are the size and length limits on a request?
| Field | Limit |
|---|---|
text | 25,000 characters |
title | 500 characters |
description | 5,000 characters |
firstComment.text | 2,200 characters |
idempotencyKey | 64 characters |
| Bulk schedule | 500 rows, 500,000 characters of CSV |
Video multipart upload to /content/video | 512 MB |
| Media library upload | 500 MB |
post_image (MCP) | 10 images |
Each platform adds its own caption, file size and duration limits. See platform constraints.
FAQ
Do drafts use my post allowance?
No. The counter moves when a draft publishes.
Why can I not post to X when I have posts left on my plan?
The X allowance is separate from the monthly post count. Check xPosts in usage.