Rate limits

API requests are rate-limited based on your subscription tier and applied per API key.

Usage is tracked against two meters:

  • Chart requests: Every call to a Chart API endpoint (chart, composite, astrology, transits, returns, retrogrades, multi-chart). Most calls count as 1 chart request; transit ranges and multi-chart batches count more.
  • SAGE responses: Every answered SAGE query. One query is one SAGE response (0 on a cache hit).

These meters are independent. A chart request does not draw down SAGE responses.

Tier limits

Every key includes the Free floor. Paid tiers add allowances on top of this floor.

TierChart requests / moSAGE responses / moRate limitMCP scopeCap behavior
Free1002510 RPMNoneHard cap
Chart20,00060 RPMNoneHard cap
SAGE3,000100 RPMSAGE toolsHard cap
Advanced40,0004,000120 RPMChart + SAGE toolsSoft cap
Pro100,00010,000300 RPMChart + SAGE toolsSoft cap
EnterpriseUnlimitedUnlimitedCustomCustomSoft cap

Chart is $22/mo or $199/yr. SAGE is $29/mo or $299/yr. Advanced is $44/mo or $399/yr. Pro is $100/mo or $899/yr. Enterprise is by contact. SAGE queries run at roughly 100 RPM regardless of tier.

Free tier floor

Free is not a separate signup. Every key includes at least 100 chart requests and 25 SAGE responses per month. A paid tier adds its allowance on top of this floor.

Tier stacking

Active subscriptions sum their allowances. You can hold up to 3 active subscriptions per product. A second Chart subscription provides 40,000 chart requests.

Metered actions

Most endpoints count 1 chart request per call. Transit ranges and SAGE queries scale based on the request:

Endpoint typeMeterCount
Chart endpoints (/api/chart, /api/composite, /api/astrology)Chart requests1 per call
Multi-chart batch (/api/multi-chart)Chart requests1 per successful chart
Planetary returns (/api/returns)Chart requests1 per request
Transit endpoints (daily granularity)Chart requests1 per day in range
Transit endpoints (hourly granularity)Chart requests3 per day in range
Transit endpoints (minute granularity)Chart requests10 per day in range
Transit periods (/api/transits/periods)Chart requests1 per request
Retrograde periods (/api/retrogrades)Chart requests1 per request
SAGE query (/api/sage)SAGE responses1 per answer (0 on cache hit)
MCP tool calls (/mcp)Same as the wrapped REST endpoint

Failed requests (4xx/5xx responses) do not count against either meter.

Rate limit and quota headers

API responses include these rate limit and quota headers:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed per minute for this key
X-RateLimit-RemainingRequests remaining in the current 60-second window
X-Quota-MeterWhich meter this response counted against: chart or sage
X-Quota-LimitMonthly allowance for that meter
X-Quota-UsedAmount of that meter consumed this billing period
X-Quota-RemainingAmount of that meter remaining this billing period

The X-Quota-* headers describe the meter named in X-Quota-Meter. Chart endpoints report chart; SAGE queries report sage. Use these headers to track remaining allowances.

Exceeding limits

When you exceed the per-minute rate limit, the API returns a 429 Too Many Requests response:

{
  "success": false,
  "error": "Rate limit exceeded",
  "message": "Your plan allows 120 requests per minute. Please slow down.",
  "retryAfter": 60
}

When your monthly allowance for a meter is exhausted, the API returns a 429 naming the exhausted meter:

{
  "success": false,
  "error": "Monthly Chart request limit reached",
  "meter": "chart",
  "limit": 20000,
  "used": 20000,
  "upgrade_url": "https://studio.totalhumandesign.com/dashboard/billing"
}

SAGE returns the same response shape with "meter": "sage". Subscribe to a higher tier or wait for the next billing period to reset.