Total Human DesignDashboard|
Documentation

Rate Limits

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

Usage is tracked against two public 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 (see below).
  • SAGE responses: every answered SAGE query. One query is one SAGE response (0 on a cache hit).

The two meters are independent. A chart request never draws down your SAGE responses and vice versa.

Tier limits

Every key includes the Free floor and adds whatever paid tier you subscribe to on top.

TierChart requests / moSAGE responses / moRate limitMCP scopeCap behaviour
Free1002510 RPMNoneHard cap
Chart20,000--60 RPMNoneHard cap
SAGE--3,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 is a floor every key gets

Free is not a separate signup. Every key already includes at least 100 chart requests and 25 SAGE responses per month, even with no paid subscription. A paid tier adds its allowance on top of that floor.

Tiers stack

Subscribe again and the allowances add. You can hold up to 3 active subscriptions per product, and their chart-request and SAGE-response allowances sum. A second Chart subscription gives you 40,000 chart requests, not a replacement.

What counts toward each meter

Most endpoints count 1 chart request per call. Transit ranges and SAGE queries count differently:

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 requests24 per day in range
Transit endpoints (minute granularity)Chart requests1,440 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) are not counted against either meter.

Rate limit and quota headers

Every API response includes the rate limit and quota headers below:

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. A chart endpoint reports chart; a SAGE query reports sage. Read them to track your remaining allowance without a separate usage call.

Exceeding limits

When you exceed the per-minute rate limit, you'll receive 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 meter that ran out:

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

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