Limits
All TagoSQL limits are plan-tiered. Enterprise plans and TagoDeploy instances can have custom values; the tables below show the standard tiers.
Plan limits
| Limit | Free | Starter | Scale |
|---|---|---|---|
| Stored queries | 3 | 15 | 50 |
| Versions kept per query | 1 | 5 | 25 |
| Parameters per query | 3 | 10 | 50 |
| Max joined tables | 1 (no JOINs) | 3 | 5 |
| Result row cap | 100 | 1,000 | 10,000 |
| Fleet devices per query | 10 | 50 | 100 |
| Fleet time window | 7 days | 30 days | 90 days |
| Query timeout | 5s | 15s | 30s |
Your profile's effective values are available on the profile limits endpoint (GET /profile/{id}/limits)
under the sql group.
The two fleet rows govern multi-device queries (device_data_by_tag):
how many devices one request may target, and how far back its mandatory time bound may reach. A tag filter
matching more devices than the cap fails with a 400 telling you to narrow the tags or paginate with
after_device.
The row cap
The row cap bounds how many rows a single execution can return. It never silently truncates a result. Instead:
- A query whose written
LIMITexceeds the cap is rejected when you store it:LIMIT exceeds the plan row cap (100). Lower it and paginate with OFFSET. - A query with no
LIMITwhose result turns out larger than the cap fails withResult exceeds the 100-row limit. Add LIMIT (and OFFSET to paginate).The rows that execution consumed still count against your data output, so fix the query rather than retrying it. - A
LIMITat or below the cap behaves normally, andOFFSETis not capped.
For paging through large result sets, prefer a parameter cursor
over a deep OFFSET: a deep offset makes the database scan and discard all skipped rows on every page.
Rate limits
Per-profile requests-per-minute caps:
| Applies to | Free | Starter | Scale |
|---|---|---|---|
| Reading queries, versions, and the table catalog | 60 | 100 | 500 |
| Creating, editing, and deleting queries | 30 | 75 | 150 |
| Fresh executions (cache miss, test mode) | 30 | 60 | 120 |
| Cached reads | 300 | 600 | 1,200 |
Over-limit requests return 429 with a Retry-After header. Each stored query can additionally set its own
rate_limit_rpm; see Executing Queries.
Data output usage
TagoSQL executions are metered against your profile's data output allocation, the same allocation regular data reads use:
- Every execution that hits the database (a cache miss or a test-mode run) records the returned rows as output usage and is blocked when the monthly output allocation is exhausted.
- Cache hits are free: a served-from-cache result consumes no output.
- A row-cap error still counts the rows the database consumed (see The row cap).