# Technical limits

SaysData enforces these technical limits to keep the service secure, healthy and available to everyone. They are separate from your monthly allowances, which your plan sets on the [Plans & Limits](/legal/plans) page, and a request refused under one of them never counts toward those allowances. The values below are the ones in force today.

## Requests

| Limit | Value |
|---|---|
| Tool calls | 60 per minute, per user |
| Search run time (`search_datasets`) | 30 seconds per call |
| Feedback message (`send_feedback`) | 4,000 characters |

## Queries

Queries for `execute_sql` and `distinct_values` run on shared query servers. A query runs in steps (for `execute_sql`: checking the statement, measuring each slice, preparing the slices and running the statement), and each step has its own run-time limit. The query part of a call, including any wait for a free slot, has a limit of its own; fetching a dataset the call needs first is not part of it (see Datasets). A query that cannot start in time because every slot is in use is refused as busy; retry shortly.

| Limit | Value |
|---|---|
| Queries running at once | 3 per query server |
| Queries waiting for a free slot | 12 per query server |
| Run time of each query step | 40 seconds |
| Query part of a call, including waiting for a slot | 60 seconds |
| Memory | 3 GB per query |
| Temporary disk | 2 GB per query |

## `execute_sql`

| Limit | Value |
|---|---|
| Result rows | 5,000 per query |
| Result size | 4 MB per query, estimated as the rows’ JSON |
| SQL statement length | 10,000 characters |
| Opening brackets in a statement | 500 |
| Rows in one slice | 1,995,840 |

## `distinct_values`

| Limit | Value |
|---|---|
| Values returned | 100 per call |

When more values match, the result returns the first ones and says it was cut short.

## Saved queries

| Limit | Value |
|---|---|
| Saved query name (`save_query`) | 200 characters |
| Saved queries listed (`find_saved_queries`) | 20 per call, the most recently saved |

When more match, the result says so; the Saved queries page on saysdata.com lists every one.

## Datasets

A request that needs a dataset SaysData does not hold up to date starts preparing it: SaysData fetches it from its provider, converts it and measures it in the background, and the dataset can be queried once that finishes. The request waits for the preparation up to the time below, except for a dataset predicted larger than the size below, which it does not wait for. A request that does not see the preparation finish answers that the dataset is being prepared, with an estimate of when it will be ready; the preparation carries on, and asking again later finds it ready. A request asking for a dataset someone else is already preparing waits for that same preparation and starts nothing. Waiting for a free preparation server or for a provider's download limit is part of a preparation, never a refusal.

| Limit | Value |
|---|---|
| Datasets being prepared at once | 3 per user |
| Wait for a preparation during a request | 150 seconds |
| Size of a dataset a request waits for | 1 GB (predicted source size) |
| Time to prepare a dataset | 3 hours per attempt; a dataset that takes longer is tried again after 24 hours |

A user's fourth preparation while three are in progress is refused, naming the three and when to try again. A dataset whose preparation fails three times in a row is reported as unavailable, with the reason, for 24 hours; after that, asking for it again tries again. A dataset its provider has no data for is unavailable until the provider publishes a new version.

## Provider downloads

OECD limits how often its data can be downloaded, so SaysData keeps its own downloads below OECD's limit. When the budget is used up, an OECD dataset being prepared waits until a download becomes available, and `describe_dataset` says so in its estimate.

| Limit | Value |
|---|---|
| OECD data downloads | 45 download attempts per hour, shared by all SaysData users and SaysData’s own data refreshes |
| Pause after OECD turns a download away | 1 hour |

## Website

| Limit | Value |
|---|---|
| Website API requests (`/api/…`) | 100 per minute, per signed-in user, or per IP address when signed out |
