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.

4 min readSume
All posts

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.

Webflow Data API rate limits (read 2026-10-10)
ItemDocumented value
Starter and Basic plans60 requests per minute
CMS, eCommerce and Business plans120 requests per minute
EnterpriseCustom
Over the limitHTTP 429 with a Retry-After header, typically 60 seconds
Usage headersX-RateLimit-Limit, X-RateLimit-Remaining, Retry-After
Site publishOne successful publish per minute
ScopePer 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

All Integrations posts

Written by Sume