Skip to content

Limits

The same caps that apply when you use Moonjar in the app apply to the API. There is no separate integrator tier with different allowances — programmatic and in-app usage count against the same monthly counters.

ResourceAllowance
Chat messages1,000 / month
Captures2,000 / month
Voice calls200 sessions / month
Voice minutes120 minutes / month
Storage20 GB

The 30-day rolling reset is per-account: it starts the first time you use any of these resources and resets exactly 30 days later. See Usage and limits for detail.

SurfaceCap
POST /api/upload (file)20 MB per file
POST /api/upload/scan (multi-page)20 pages per upload
POST /api/transcribe (audio)25 MB per clip
GET /api/atlas/points500 per type by default, 2000 max
GET /api/search100 results max per request
POST /api/chat (per turn)30 iterations / 100 tool calls

These are hard limits enforced by the server. A request over the limit is rejected with a 4xx error.

Most endpoints aren’t rate-limited beyond the monthly caps. The authentication endpoints have their own short-window throttling to prevent brute-force:

  • POST /api/auth/signup — 3 / hour per IP.
  • POST /api/auth/request-code — 5 / hour per IP.
  • POST /api/auth/verify-code — 10 / hour per IP.

These are intentionally low — successful sign-in moves you off the auth endpoints, so a real user won’t see them.

Hitting a monthly allowance returns a clear error:

{ "error": "Monthly chat limit reached", "resource": "chat", "resets_at": "..." }

Hitting a per-request cap returns 4xx with the limit referenced.

The server doesn’t apply any global per-second / per-minute rate limit on authenticated endpoints beyond the monthly allowances and the auth-window throttles above. Heavy clients should still be considerate — Moonjar’s database is the same one the mobile app talks to.

Uploading a file that would push your storage past 20 GB is rejected at the upload endpoint. The document isn’t created. Delete other documents to free space first.