Rate Limits & Pricing
What Chirpie costs, monthly post quotas, per-post overage rates, the X link-post charge, burst limits, and how to handle rate limiting.
How much does Chirpie cost?
Chirpie is free for 50 posts a month, then $9/mo (Agent), $19/mo (Starter), or $49/mo (Pro); Scale and Enterprise are custom. Every plan includes the full API, SDK, CLI, MCP server, and Skills, plus scheduling, threads, and analytics across every connected platform. There are two usage charges on top of the flat price: per-post overage past your monthly allowance, and the X link-post charge (see below). Both are billed on delivery: a post is only ever charged once it has actually reached the platform.
Quotas reset on the 1st of each month (UTC):
| Plan | Posts/mo | Scheduled/mo | Accounts | Price | Extra posts |
|---|---|---|---|---|---|
| Free | 50 | 25 | 1 | $0 | Not available (hard limit) |
| Agent | 300 | 150 | 1 | $9/mo | $0.03/post |
| Starter | 1,000 | 500 | 3 | $19/mo | $0.03/post |
| Pro | 5,000 | 2,500 | 10 | $49/mo | $0.025/post |
| Scale | 25,000+ | 12,500+ | 25+ | Custom | Custom |
| Enterprise | Unlimited | Unlimited | Unlimited | Custom | Custom |
How do I change my plan?
From the dashboard billing page. Pick a plan and you are taken to Stripe Checkout; paying returns you straight to the billing page, which confirms the new plan on the spot and shows your updated limits. The plan you are on is the one marked Current plan, and its card's button is disabled. Plans above it read Upgrade, plans below it read Downgrade, and Scale reads Contact us.
- Already subscribed? Changing plan happens in place on your existing subscription. Upgrades are charged the mid-cycle difference immediately; downgrades bank a credit against your next invoice.
- Moving down to Free means cancelling, which you do through Manage Subscription. You keep your paid limits until the end of the period you have already paid for.
- If your bank is still confirming the payment, the billing page says so and your new limits appear automatically as soon as it clears. There is no need to pay again.
What happens when I go over my monthly posts?
On Agent, Starter, and Pro, nothing breaks: extra posts keep publishing and are billed per post on your next invoice. On Free, they stop.
- Free: hard monthly limit. Requests beyond 50 posts return
429 usage_limit_exceededuntil the quota resets on the 1st of next month (UTC). Upgrade anytime for more capacity. - Agent / Starter / Pro: posts past the allowance publish as normal and are metered at your plan's per-post rate ($0.03 on Agent and Starter, $0.025 on Pro). Only the posts above the allowance are charged.
- Scheduled posts: charged when the post actually publishes, never when you schedule it. Cancel a scheduled post before it goes out (or let it exhaust its retries and fail) and it costs nothing and gives its quota slot back.
- Scale / Enterprise: custom quotas rather than per-post overage. Contact us at hey@chirpie.ai.
When am I charged for a scheduled post?
When it publishes, never when you schedule it. Both usage charges, per-post overage and the X link-post charge, are billed on delivery.
- Scheduling a post reserves a slot against your monthly allowance immediately, so you always know where you stand against your quota.
- Nothing is billed until the post actually reaches the platform.
- Cancelling a scheduled post before it goes out costs nothing and returns its quota slot. So does a post
that exhausts its retries and ends up
failed. - The returned slot is credited to the month the post was scheduled in, even if you cancel it after the 1st of the following month.
Why are X posts with links billed separately?
Because X itself charges far more for them. Per X's published API pricing, X bills API operators $0.20 for a post containing a URL against $0.015 for a plain-text post, roughly 13x more to deliver the same post. Rather than raise every plan's price to cover it, Chirpie passes that cost through only on the posts that incur it.
How much is an X link post?
$0.25 per X post whose text contains a link, on paid plans, on top of your monthly allowance.
- What counts as a link: an
http(s)://URL or a bare domain X would auto-link, such aschirpie.ai. Detection matches X's own auto-linking, so a bare domain is a link post. - Paid plans (Agent, Starter, Pro, Scale, Enterprise): billed at $0.25 per link post. The post also counts against your monthly post quota as normal.
- Free plan: X posts containing a link are rejected with
402 x_link_posts_require_paid_plan, before any quota is consumed. Remove the link, upgrade, or bring your own X keys. - Threads: each post in an X thread is judged on its own text: a 5-post thread with 2 links is charged 2 x $0.25.
- Scheduled posts: charged when the post actually reaches X, never when it is scheduled. Cancel it before it publishes and you are not charged.
- Your own X API keys: X accounts connected with your own X API credentials are exempt, and you pay X directly at your own rate.
- Never charged: X posts without links, and posts to every other connected platform.
How many comment syncs do I get?
Reading the comments Chirpie has already stored is unlimited. Refreshing them from the platform is what counts, and one sync is one refresh of one post.
| Plan | Comment syncs/mo | X comment reads/mo |
|---|---|---|
| Free | 200 | Not included |
| Agent | 1,000 | 500 |
| Starter | 5,000 | 2,000 |
| Pro | 25,000 | 10,000 |
| Scale | Custom | Custom |
| Enterprise | Unlimited | Unlimited |
- A sync is a refresh, not a read. Listing the comments on a post costs nothing. A
refresh is triggered automatically when the stored comments are older than the platform's
refresh window, or when you ask for one with
sync=true, which is honoured a minute after the last refresh of that post (15 minutes on X). See how often a listing refreshes. - X is metered twice, because X bills per object returned rather than per request: an X comment read unit is one reply X handed back. A busy X post therefore spends more of the X allowance than a quiet one, while still costing exactly one sync.
- Your own X API keys: X accounts connected with your own X API credentials are exempt from the X read allowance, and you pay X directly at your own rate. They still count against the monthly sync allowance.
- On the Free plan, a listing for an X post answers from whatever is stored with
sync.status: "plan". It is a200with an explanation, not an error. - Past the allowance, listings keep working from the stored comments, with
sync.status: "budget".402 comment_read_budget_exceededis returned only when there is nothing stored and you asked for a refresh explicitly. - Replies count as posts. A reply is published to the platform like any other post, so it comes out of your monthly post quota. Hiding and deleting cost nothing.
Full details on the Comments API page.
Burst Rate Limiting
The burst limit is per API key, per minute, on a sliding window, and the ceiling comes from your plan. It is separate from your monthly post quota: the burst limit counts requests, the quota counts published posts.
| Plan | Burst limit |
|---|---|
| Free | 120 requests/min |
| Agent | 600 requests/min |
| Starter | 600 requests/min |
| Pro | 1,200 requests/min |
| Scale | 1,200 requests/min |
| Enterprise | 1,200 requests/min |
Every key on an account shares the plan's ceiling but counts separately, so one key running a backfill does not starve another key serving your app.
Do not hard-code the number. X-RateLimit-Limit on every response is the ceiling actually in
force for the key that made the request, so a client that paces on the headers keeps working
when you change plan.
Rate Limit Headers
Every authenticated /api/v1/* response carries your current burst budget, so you never have
to guess:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests allowed per window for this key, which is your plan's ceiling from the table above |
X-RateLimit-Remaining | Requests left in the current window |
X-RateLimit-Reset | Unix timestamp, in seconds, when the window resets |
Retry-After | Seconds to wait. Present only on a 429 from the burst limiter |
Retry-After is deliberately absent from the quota 429 (usage_limit_exceeded)
and the account-limit 429 (account_limit_reached), because waiting frees
neither a post from the monthly quota nor an account slot.
One other 429 does carry Retry-After: analytics_refresh_rate_limited, from
asking analytics for a forced refresh more
than once per post per 5 minutes. It is per post rather than per key, so it does
not touch your burst budget.
Handling 429 Responses
When you hit a limit, the API returns 429:
{
"error": {
"code": "usage_limit_exceeded",
"message": "Monthly post limit reached (50/50). Upgrade your plan."
}
}The burst limiter uses the same status with a different code:
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Try again shortly."
}
}Retry recipe
- Read
Retry-After. If it is present, sleep that many seconds and retry once. - If it is absent, do not retry the same request. Either a monthly quota is
spent (
usage_limit_exceeded) or your plan is out of account slots (account_limit_reached), and neither clears by waiting. - Stay ahead of the limiter: when
X-RateLimit-Remainingreaches zero, wait untilX-RateLimit-Resetbefore sending the next request.
const res = await fetch(url, { headers });
if (res.status === 429) {
const retryAfter = res.headers.get("Retry-After");
if (retryAfter) {
await new Promise((r) => setTimeout(r, Number(retryAfter) * 1000));
// retry once
} else {
// quota or account limit: upgrade or free a slot, do not loop
}
}Best Practices
- Check your usage before bulk operations, using the dashboard billing page
- Pace on the headers, rather than retrying blindly
- Batch scheduling: schedule posts with staggered times rather than posting all at once
- Use threads: a 10-post thread is one API call (though it counts as 10 posts against your quota)
- Send an
Idempotency-Keyon anything you might retry, so a retry after a429cannot publish the same post twice. See Idempotency
Platform Rate Limits
In addition to Chirpie's limits, each platform enforces its own rate limits. More platforms are coming soon; the limits below cover every platform Chirpie posts to today.
X/Twitter
X enforces approximately 200 tweets/user/day. If X rate-limits your account, Chirpie returns a 502 error. Scheduled posts will be retried automatically.
Bluesky
Bluesky enforces rate limits via the AT Protocol (approximately 1,667 actions/day, 35 actions/30 seconds). If Bluesky rate-limits your account, Chirpie returns a 502 error. Scheduled posts will be retried automatically.
LinkedIn enforces approximately 100 posts per day per member. If LinkedIn rate-limits your account, Chirpie returns a 502 error. Scheduled posts will be retried automatically.
Threads
Threads enforces a limit of 250 posts per 24-hour period. If Threads rate-limits your account, Chirpie returns a 502 error. Scheduled posts will be retried automatically.
Mastodon
Mastodon enforces a default limit of 300 posts per 3-hour period (varies by instance). If Mastodon rate-limits your account, Chirpie returns a 502 error. Scheduled posts will be retried automatically.
Instagram enforces a limit of 50 posts per 24-hour period. If Instagram rate-limits your account, Chirpie returns a 502 error. Scheduled posts will be retried automatically.
Facebook enforces a limit of 4,800 API calls per 24-hour period per page. If Facebook rate-limits your page, Chirpie returns a 502 error. Scheduled posts will be retried automatically.
Telegram
Telegram enforces approximately 30 messages per second to the same chat. If Telegram rate-limits your bot, Chirpie returns a 502 error. Scheduled posts will be retried automatically.
Character Limits
| Platform | Standard Limit | Extended Limit |
|---|---|---|
| X/Twitter | 280 characters | 25,000 (Premium) |
| Bluesky | 300 characters | None |
| 3,000 characters | None | |
| Threads | 500 characters | None |
| Mastodon | 500 characters | None (varies by instance) |
| 2,200 characters | None | |
| 63,206 characters | None | |
| Telegram | 4,096 characters | None |
More platforms coming soon.