# Rate and payload limits

Source: https://help.ruuster.com/api/limits

> Per-minute rate limits, daily row quotas, page sizes, range caps, and how to pull large amounts of data.

| Limit | Default | Applies to |
|---|---|---|
| Requests | 120 per minute | each key |
| Lookup calls | 20 per minute | each key, on the calls marked *lookup* below |
| Requests from one network | 600 per minute | each source IP, all keys |
| Rows per day | 250,000 | each key, every row returned |
| Lead rows per day | 50,000 | each key, rows containing a lead's details |
| CMAs per day | 200 | each brokerage, all keys together (`POST /cma`; reading a stored CMA is free). Your CSM can change it |
| Public record calls per day | 500 | each brokerage, all keys together (`/public-records/lookup` and `/public-records/{recordId}/history`). One home per call: not for bulk exports |
| Page size | 100 default, 500 max | list calls |
| Page size with lead details | 200 max | `/leads`, `/leads/activity`, `/leads/lookup` and `/properties/{propertyId}/viewers` |
| Date range | 93 days at `day`, 400 days at `week`, 36 months at `month` | series calls |
| Response size | 2 MB, then the rest is on the next page | every call |
| Series length | 2,000 rows per response | series calls |
| Request body | 64 KB | webhook management calls |

*Lookup* calls search Ruuster's records on demand rather than from prepared reports, so they have
their own, lower limit: `/leads`, `/leads/lookup`, `/leads/{leadId}/emails`, `/properties/lookup`, `POST /cma` and the
`/public-records` calls.

Every response carries your current position:

```
x-ratelimit-limit: 120
x-ratelimit-remaining: 117
x-ratelimit-reset: 1790863260        (unix seconds when the minute window resets)
x-daily-rows-limit: 250000
x-daily-rows-remaining: 248310
```

Over a limit you get `429` with a `Retry-After` header in seconds: `rate_limited` for per-minute
limits, `daily_quota_exceeded` for daily row limits (they reset at midnight America/Chicago). Wait
that long before retrying. Your CSM can raise limits for a specific integration.

**Pulling large amounts of data**
- Add `?countOnly=1` to any list call to get `{ "total": n }` without rows, so you can size a sync.
- Use `/properties/engagement` instead of one call per listing.
- Use `/leads/activity` to find active leads instead of paging the whole roster.
- *Planned:* `changedSince` to pull only what changed since your last sync.
- The API is built for incremental pulls, not full dumps. If you need a one-time full export, talk to
  your CSM about options.

Items marked *Planned* on these pages aren't available yet. They're listed in the
[changelog](https://help.ruuster.com/api/changelog) and move out of *Planned* when they ship.
