user.* events they can send. The defaults are:
| Resource | Default per user |
|---|---|
| Conversations | 5 per minute |
| User events | 100 per minute |
subjectId, so different users and agents have independent allowances.
Configure limits
SetrateLimits when you create an agent:
rateLimits object.
Use a stable subject ID
Pass the samesubjectId whenever the same user creates a session for an
agent. The SDK calls this value userId; it maps to subjectId in the REST API.
Do not generate a new value per session or request.
Multiple API keys acting for the same organization, agent, and subject share
the same per-user counter. A caller that changes subject IDs can evade this
counter, so only derive subject IDs from authenticated identities you trust.
What counts
A conversation is counted whenPOST /v1/sessions accepts and durably creates
the session. Later runtime startup failures do not restore that allowance.
A message allowance point is counted for every accepted inbound user.* event:
- Every event in a batch counts separately.
- Immediate events count when they are accepted for persistence.
- A
delivery: "when_idle"prompt counts when it enters the durable queue, not again when the queue drains. - Validation, not-found, archived-session, and prompt-conflict failures rejected before persistence do not count. A control event that is persisted but cannot reach a live turn does count.
- Steer, approval, clarification, interrupt, custom-tool-result, and other
control or result events each count like
user.message.
Rate-limit responses
An exceeded operation returns429 rate_limited immediately; Herm does not
queue it automatically. The response identifies whether the conversations or
messages allowance was exceeded and includes the number of seconds until the
fixed window resets.
Successful operations return RateLimit-Limit, RateLimit-Remaining, and
RateLimit-Reset. A 429 also returns Retry-After and
Cache-Control: no-store.
See Errors for the complete body, headers, and retry
guidance.

