Skip to content
Metric VaultHelp Center
Open app

Rate limits and quotas

The hourly fair-use limit, the monthly credit quota, and every payload, pagination and timeout cap that applies to an API call.

Last updated 2026-08-06

Summary#

Two independent ceilings govern API usage. An hourly fair-use limit of 100 calls caps light, low-cost work and protects the platform from scraping. A monthly credit quota set by your plan caps expensive work. On top of those sit a set of payload, pagination and timeout limits per endpoint. This page lists all of them with exact numbers, so you can size a job before you run it.

Overview#

Which ceiling applies to a given call#

Every metered call carries a credit cost. That cost decides which ceiling applies:

Cost of the callMonthly quotaHourly limit
0 creditsNot countedCounted
1 or 2 credits ("light")Not blocked by quotaCounted, 100 per hour
3 credits or more ("premium")Blocked when the allowance is spentNot counted

The threshold is exactly 3. A call costing fewer than 3 credits is treated as light and is never blocked by the monthly quota; a call costing 3 or more is checked against it. POST /api/v1/analyze costs 6, so it is governed by your monthly quota and is not subject to the hourly limit.

Important

Important: Free-plan accounts are a separate case. Any call costing more than 0 credits is refused with upgrade_required, regardless of either ceiling. Free includes the 10 technical SEO tools and nothing else.


The hourly fair-use limit#

PropertyValue
Limit100 light-tool calls per hour
BucketOne clock hour in UTC, keyed YYYY-MM-DD-HH
ScopePer account, or per IP address for anonymous callers
ResetOn the hour, not on a rolling window
ResponseHTTP 429, code: "hourly_rate_limit"
On limiter failureFails open. The call is allowed

The 429 body:

json
{
  "error": "Hourly fair-use limit reached (100 light-tool calls/hour). This protects our infrastructure from abuse while keeping your monthly usage unlimited. Please wait ~14 minutes for the next hourly reset.",
  "code": "hourly_rate_limit",
  "limit": 100,
  "used": 100,
  "reset_in_minutes": 14
}

Because the bucket is a clock hour rather than a sliding window, the wait is never more than 60 minutes and reset_in_minutes tells you exactly how long.

IP-keyed buckets#

Two paths are limited by IP address rather than by account:

PathWhen
/api/toolsThe caller sent no user_email
/api/translateAlways. This endpoint has no account concept

Both share the same 100-per-hour ceiling, keyed on the connecting IP. Traffic from behind a shared egress address therefore shares one bucket.


The monthly credit quota#

Credits reset at the start of each UTC calendar month. Usage is the sum of AI runs and tool runs for that month.

PlanCredits per month
Free0
Starter100
Pro500
Agency2,000
Enterprise10,000

The 429 when the allowance is spent:

json
{
  "error": "You've used all 10000 premium reports on the ENTERPRISE plan this month. Light tools (keyword research, SERP, content, technical audits) keep working. Quota resets on September 1, 2026 (in 26 days). Upgrade to continue using premium reports now.",
  "code": "quota_exceeded",
  "plan": "enterprise",
  "used": 10000,
  "quota": 10000,
  "cost": 6,
  "reset_at": "2026-09-01T00:00:00.000Z",
  "reset_date": "September 1, 2026",
  "days_until_reset": 26,
  "upgrade_url": "https://metricvaultai.com/index.html#pricing"
}

Read reset_at rather than parsing reset_date, and do not retry before it. See Quotas and rate limits and How credits work.

What the public API costs#

EndpointCostCalls per month at each plan
POST /api/v1/analyze6 creditsEnterprise 1,666. Lower plans cannot call it at all

Usage from the API is attributed to the tool name domain_overview and appears in the same monthly totals as work done in the app. Query it with POST /api/usage, which returns used, quota, remaining, percent_used, near_limit, over_limit, days_until_reset and a per-tool breakdown.

The recommendations quota#

The Get Recommendations feature has its own separate monthly allowance, checked before the credit quota.

PlanAI recommendations per month
FreeNot available
StarterNot available
Pro100
Agency400
Enterprise2,000

Below-tier calls return 403 with reco_upgrade_required; exhausted allowances return 429 with reco_quota_exceeded. The minimum plan and the per-plan numbers are operator-tunable, so treat the table as the current defaults rather than a contract.

Order of the gates#

The gates run in a fixed order, and the first failure wins:

  1. No identifiable account and a cost above zero → 401 auth_required.
  2. Account suspended → 403 account_suspended.
  3. Free plan and a cost above zero → 403 upgrade_required.
  4. Cost below 3 → hourly limit, then allow.
  5. Cost of 3 or more → monthly quota check.
  6. Any lookup failure → 503, failing closed.

Payload limits#

EndpointFieldLimitOver-limit behavior
/api/translateNumber of strings100 per request400 Too many strings (max 100 per request)
/api/translateTotal characters20,000 per request400 Payload too large (max 20000 chars per request)
/api/share/createhtml_content2,000,000 characters400 Report too large — max 2MB
/api/library/save-runSerialised payload1,600,000 characters200 with reason: "data_too_large"
/api/library/saved/htmlhtml900,000 characters200 with reason: "too_large"
/api/library/saved/deleteids200 ids per callExtra ids ignored
/api/branding/savelogo_data_url520,000 characters400 Logo too large — keep it under 500KB
/api/branding/savecompany_nameTruncated to 120 charactersSilent truncation
/api/branding/savecustom_footerTruncated to 300 charactersSilent truncation
/api/social/schedulePost textTruncated to 4,000 charactersSilent truncation
/api/social/publishX post text280 charactersThis post is <n> characters; X allows 280.
Blog media uploadFile size5 MB400 Max 5MB
Blog media importFetched size15,000,000 bytes413 Image is larger than 15MB
Blog newsletter sendRecipients2,000 per sendCapped, capped flag returned
/api/tier2/compareBrands5Extra brands ignored
Request body inspected for activity loggingBody size24,000 bytesLarger bodies pass through unlogged

Pagination and range limits#

EndpointParameterRangeDefault
/api/librarylimit1 to 20060
/api/library/savedlimit1 to 10040
/api/monitor/changeslimit1 to 500200
/api/monitor/snapshotlimit1 to 10020
/api/share/listRows returnedFixed 5050
/api/notificationsItems returnedFixed 50, from a 14-day window50
/api/social/scheduledRows returnedFixed 100100
/api/tier2/trends/exportdays1 to 36590
/api/tier2/comparedays1 to 18030
/api/tier2/alerts/adddrop_threshold_pct1 to 9915
/api/rank-alerts/createdrop_threshold1 to 205
/api/monitor/addcheck_interval_hours1 to 486
Blog public postsper_page1 to 5020
Blog stock/searchpage1 to 201
Blog subscribersRows returnedFixed 500500
/api/admin/auditlimit1 to 50050
/api/admin/runslimit1 to 20050
/api/admin/blog/postslimit1 to 20050
/api/admin/metricshoursUp to 168
/api/workflow/failureslimitUp to 1,000200

Timeouts#

OperationTimeout
Responsive analyzer, page fetch and analysis40 seconds
Responsive analyzer, follow-up chat25 seconds
Responsive preview proxy, page fetch15 seconds
Responsive preview asset fetch12 seconds
Stripe webhook signature freshness300 seconds of clock skew tolerated
Social OAuth state15 minutes, single use

Long-form article generation runs inline on POST /api/premium-ai. The per-completion budget scales with the requested length: 90 seconds for the large content types (6000 output tokens or more), 45 seconds otherwise. Both sit under Cloudflare's 100-second idle ceiling. Set a client timeout above the larger one.

Set a client timeout of at least 60 seconds on POST /api/v1/analyze. It runs a model call inside the request.

Retention#

DataRetained
Saved tool results90 days
Article jobs1 hour
Notifications feed window14 days
Shared report linksUntil deleted, or until their expiry date
Search Console performance cache1 hour
Extension quickview cache24 hours
Benchmarks cache30 days
Shared tool-data cache12 hours to 10 days, per tool

Caching is explained in Result caching and freshness. Note that a cache hit still charges your credits: caching saves the provider bill and the wait, not the cost.

Practical sizing#

JobArithmeticVerdict
40 domains through /api/v1/analyze nightly40 × 6 = 240 credits a night, 7,440 a monthFits Enterprise's 10,000, with little headroom
100 domains weekly100 × 6 = 600 credits a week, about 2,600 a monthComfortable on Enterprise
500 domains in one run3,000 credits in one sittingAllowed, but spend 30 percent of the month in one job

There is no concurrency limit on the public endpoint. Your monthly quota is the real ceiling, and a burst simply spends it faster.

Handling limits in a client#

  • Read code first. hourly_rate_limit is worth waiting out; quota_exceeded is not.
  • On hourly_rate_limit, sleep for reset_in_minutes and retry.
  • On quota_exceeded, stop and alert a human. Retrying before reset_at will fail identically.
  • On 503 with plan_check_failed or quota_check_failed, retry with exponential backoff. Nothing was charged.
  • Poll POST /api/usage before a large job and abort if remaining is less than the job's cost.

See also

Was this article helpful?