# Limits & billing

## What costs what

API access is part of your TruTec plan. There's no separate API fee and no charge per call for reading or writing your own data.

| Call | Cost |
|---|---|
| Reading and writing customers, sites, jobs, estimates, job costing, events, webhooks and exports | Included |
| Reading saved measurements, results and imagery | Included |
| Polling a measurement's status (`GET /detect/status/{job_id}`) | Included |
| Finding parcels (`GET /parcels`, or MCP `find_parcels`) | Included |
| Map images of saved takeoffs (`export-image`, `imagery`, `map-link`, or MCP `get_map_image`) | Included |
| Starting a measurement (`POST /detect/full`, `/detect/address`, `/detect/tiles`, or MCP `measure_site` / `create_takeoff`) | Counts as one measurement on the key, however many parcels or areas it covers. Volume and any per-measurement price are set by your plan or agreement |
| A condition rating (`POST /condition/paser` or `/condition/pci`) | Set by your plan or agreement |
| Starting a blueprint takeoff (`POST /jobs/{job_id}/blueprint-takeoffs`, or MCP `create_blueprint_takeoff`) | One takeoff credit, the same as starting an AI Blueprint takeoff in the app. Sheets, scale and title reads, model runs and edits on it are included. See [Blueprint takeoffs](blueprints.md) |

Reading a finished measurement again is free, so save the `job_id` and re-read it instead of measuring the same site twice.

## Rate limits

We don't enforce a fixed requests-per-minute limit today. To keep things fast for everyone, and to stay inside any limit we add later:

- keep to about **10 requests per second** per workspace,
- run at most **5 measurements at once**, and poll each one no more than every **3 seconds**,
- use [webhooks or the event feed](webhooks-and-events.md) to learn about changes instead of re-reading everything on a timer,
- use [bulk export](bulk-export.md) for full copies of your data instead of paging through every endpoint.

Handle `429 Too Many Requests` now: back off and retry, honoring `Retry-After` if it's present ([Errors & retries](errors.md#retries)). If we introduce or change a rate limit, we'll announce it the way we announce other changes ([Versioning & changes](versioning.md)).

## Per-key call caps

You can ask us to put a cap on the number of calls a key can make, which is useful for a contractor's integration, a pilot or a test key. When a key reaches its cap, calls return `429` with the cap and the count:

```json
{
  "error": "API usage limit exceeded",
  "message": "This API key has reached its limit of 500 calls",
  "usage": {"count": 500, "limit": 500}
}
```

## Request limits

- Send JSON bodies under 10 MB. Photo and file uploads have their own limits, listed on their endpoints.
- Measurement areas have a maximum size; the limits and the error you get are in [Measure a site](measure-a-site.md).
- List endpoints are paged. Each page's maximum size is listed on the endpoint.
