Webflow Data API 60 requests a minute: writing 100 Sume results back
Webflow's Data API allows 60 requests a minute on Starter and Basic, 120 on CMS, eCommerce and Business. Queue Sume results and honor Retry-After.

If you write 100 Sume results back into Webflow CMS items, one request per item takes at least two minutes on a Starter or Basic site, because Webflow allows 60 requests per minute there. CMS, eCommerce and Business plans allow 120. Queue the writes, pace them, and respect the Retry-After header on any 429.
Sume is not a Webflow app, so this is a generic webhook-in, API-out pattern. Sume tells you a job finished; your code then makes the Webflow call.
The Webflow limits
These are from Webflow's own rate-limit page. The limit is applied per API key, so two automations that share a key share the budget.
| Item | Documented value |
|---|---|
| Starter and Basic plans | 60 requests per minute |
| CMS, eCommerce and Business plans | 120 requests per minute |
| Enterprise | Custom |
| Over the limit | HTTP 429 with a Retry-After header, typically 60 seconds |
| Usage headers | X-RateLimit-Limit, X-RateLimit-Remaining, Retry-After |
| Site publish | One successful publish per minute |
| Scope | Per API key |
What that does to a Sume batch
Sume jobs finish on their own schedule, and with webhook mode each completion arrives as its own job.completed event carrying the artifact URL, as described on the webhooks page. A hundred completions can land within a short window, which is more than a Starter site accepts in that time. Do not write from inside each webhook handler. Acknowledge the delivery, put the job id and artifact URL on a queue, and let one worker drain it at a steady rate.
Webflow's page also advises using webhooks instead of aggressive polling, which fits: let Sume push to you, and only poll the job status URL as a fallback.
A pacing loop
The function below spaces calls to the plan's per-minute limit and sleeps for the Retry-After value when it gets a 429. The send callable is yours: it should make the Webflow request and return the status code and the Retry-After header value (or None). The demo at the bottom uses a fake sender so the script runs as is.
import time
def drain(items, send, per_minute=60):
gap = 60 / per_minute
for item in items:
while True:
status, retry_after = send(item)
if status != 429:
break
time.sleep(float(retry_after or 60))
time.sleep(gap)
def fake_send(item):
print("wrote", item)
return 200, None
drain(["job_1", "job_2", "job_3"], fake_send, per_minute=600)Publishing
Webflow limits site publishes to one successful publish per minute. Write all the items first, then publish once. Publishing after every item would turn a two-minute job into a hundred-minute one.
One more point: a 429 from Webflow is not a Sume failure. The generated file is already stored at its artifact URL, so retrying the Webflow write is safe and never needs a new paid Sume job.
- Pace to 60 or 120 requests per minute depending on plan.
- Queue Sume completions; drain with one worker.
- Sleep for Retry-After on a 429.
- Publish once after the batch.
- Key your queue on job_id so a repeated delivery adds nothing.
Sources
Related posts
More in Integrations
- WordPress Action Scheduler: poll a Sume run as a queued action
Action Scheduler claims 25 actions per batch and marks any running over 5 minutes as failed. Schedule a short Sume poll action instead of waiting inside one.
- Zapier Delay After Queue: space out Sume submits
Zapier's Delay After Queue releases held tasks one at a time, so a burst of rows does not hit Sume together. Here is the setup, the limits and the cap to set.
- How to add an MCP server to ChatGPT with developer mode
Turn on ChatGPT developer mode, create an app for the server's URL, and sign in with OAuth. The steps, with Sume's hosted MCP server as the example.
- How to add subtitles to a video in Python
Add subtitles to a video in Python with Requests: POST the video URL to Sume's /v1/video-captions, poll the job, then read the captioned video_url.
Written by Sume