WebmeticDocs
Get startedDetectEnrichPersonalizeIntegrateManagePartnersDevelopers

Rate limits

Rate limits define how often you can call an endpoint and how much data one request covers.

The eight visit endpoints of Visitor Intelligence answer one request per second per endpoint. For example, your n8n workflow calls /company-sessions for each of your websites in turn. If it waits one second between calls, it runs through without errors. There is no daily or monthly request quota.

Rate limit per endpoint

These endpoints accept one request per second: /company-sessions, /company, /company_nace, /session, /session_user_data, /intensive-visits, /returning-visits, and /new-visits.

The limit applies to each endpoint separately: a call to /company and one to /session in the same second don't affect each other. The limit is the same on every plan.

The Partner API has its own per-minute limits.

Enrichment (/enrichment/*), contacts (/contacts/*), and webhooks (/webhooks) currently have no rate limit. That can change, so build the retry on status 429 into every integration. When you unlock contact data, your credits limit the amount, not the number of requests. For details, see Credits in the API.

Response when you exceed it

If you exceed the limit, the API answers with status 429 and the error code RATE_LIMITED. The Retry-After header gives the seconds until the next attempt:

HTTP/1.1 429 Too Many Requests
Retry-After: 1

{
  "detail": {
    "error": "RATE_LIMITED",
    "message": "Rate limit exceeded: 1 per 1 second. Wait and try again."
  }
}

The rejected request returns no data. Wait the number of seconds in Retry-After and then send the request again. On the visit endpoints that's one second, and the Partner API gives the value for its per-minute limit. All error codes are listed under Errors.

Retry with a wait

Send requests to the same endpoint one after another, not in parallel. If the API still answers with status 429, we recommend this flow:

  1. 1Send the requestYour integration calls the endpoint.
  2. 2Check the statusFor any status other than 429, it processes the response.
  3. 3WaitOn 429, it waits the seconds in Retry-After. If the header is missing, it waits one second and then twice as long each time.
  4. 4Send againAfter five attempts, it stops and reports the error.

The example calls /company-sessions with this flow:

delay=1
for attempt in 1 2 3 4 5; do
  status=$(curl -s -D headers.txt -o response.json -w "%{http_code}" \
    "https://hub.webmetic.de/company-sessions?domain=your-website.com" \
    -H "Authorization: wmtc_YOUR_API_KEY")
  if [ "$status" != "429" ] || [ "$attempt" -eq 5 ]; then break; fi
  retry_after=$(grep -i '^retry-after:' headers.txt | tr -dc '0-9')
  sleep "${retry_after:-$delay}" # Retry-After first, else the backoff
  delay=$((delay * 2)) # wait longer after each 429
done

Size limits

Besides the rate limit, the API limits how much a single request covers:

AreaLimit
Visitor Intelligencepage_size up to 10,000 entries per page, pages from 1
Contact searchsize 10 to 25 results per page, pages from 0
EnrichmentUp to 5,000 domains per call, page_size up to 10,000 entries per page
Webhooks per account50 through the API, 10 through the dashboard. Both count together
Custom headers per webhookUp to 3
Response time of your server for webhooks10 seconds
Retries of failed deliveries3 days

If a request exceeds a size limit, the API answers with status 422 and VALIDATION_ERROR. If you create a webhook beyond the account's limit, the API answers with status 409 and WEBHOOK_LIMIT_REACHED.

Next steps

On this page