Skip to main content
Ploti limits how fast an API key calls and how much one read returns, so one busy program can’t slow everyone else. Every refusal comes with a stable code and a message that says what to do next.

Rate limits

  • Every call: 120 a minute per key, over every interface together (the CLI and Python call REST).
  • Heavier calls: 20 a minute, on top of that, for calls that search widely or start work: datasets search, datasets aggregate, datasets estimate, datasets profile, maps files export, requests create, requests gaps file, webhooks test, and feeds subscriptions create, update, preview and manifest.
  • Maps: a workspace may make 20 maps an hour.
Over a limit, the answer is 429 rate_limited with a Retry-After header in seconds. The CLI’s downloads wait it out on their own.

Read limits

  • Each read stops after 30 seconds, and a sorted read can page up to 50,000 rows in.
  • Each key runs at most 4 reads at once, and reads at most 300,000 rows, 500 MB and 120 seconds of query time a minute.
  • For more than a few pages, download the dataset.

Other limits

Errors

A refusal is JSON with a code, a message and links:
Show the message and its link to the person, and don’t retry until they have acted on it. A program running on its own should log the code and message and stop that task. The exception is rate_limited, which it can retry after Retry-After seconds. Codes you will meet: Data Feeds has a few codes of its own, such as not_subscribed and expired, explained on its pages. In each interface:
  • CLI: prints the message and its links and exits with status 1.
  • Python: raises ploti.PlotiError with code, message, links and, for a rate limit, retry_after in seconds.
  • REST: the JSON above, with the HTTP status.
  • MCP: the tool result is marked as an error, with the same message for the assistant to act on.