Skip to content

Rate Limits

Understand API rate limits and how to handle them. Every request counts toward your plan’s hourly quota, and the API returns headers so you can track usage in real time.

For authentication setup, see Authentication.

PlanRequests/hourPosts/monthBlogs
Free6010 total1
Starter ($9)300151
Creator ($29)1,000503
Scale ($79)10,000Unlimited5
Enterprise ($199+)10,000+UnlimitedUnlimited

See Plans for full feature comparison.

Every API response includes rate limit headers:

X-RateLimit-Limit: 300
X-RateLimit-Remaining: 142
X-RateLimit-Reset: 1711324800
  • X-RateLimit-Limit — Your plan’s hourly limit
  • X-RateLimit-Remaining — Requests left in current window
  • X-RateLimit-Reset — Unix timestamp when the window resets
const res = await fetch('https://api.postlark.ai/v1/posts', {
headers: { Authorization: 'Bearer pk_live_xxxxxxxxxxxx' },
});
const remaining = parseInt(res.headers.get('X-RateLimit-Remaining') ?? '0', 10);
const resetAt = parseInt(res.headers.get('X-RateLimit-Reset') ?? '0', 10);
if (remaining < 10) {
const waitMs = (resetAt * 1000) - Date.now();
console.log(`Low on quota. Resets in ${Math.ceil(waitMs / 1000)}s`);
}

When you exceed your hourly limit, the API returns 429 Too Many Requests:

{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded. Limit: 60 requests/hour.",
"retry_after": 1823
}

Wait retry_after seconds before retrying.

If you exceed your monthly post limit, you can purchase Post Packs as an add-on:

  • 100 posts — $10 (no expiry)
  • 300 posts — $25 (no expiry)

Monthly quota is consumed first, then packs. See Plans for pricing details and how to purchase.