VirusTotal API Rate Limit 429 Errors: Why Your IOC Enrichment Pipeline Keeps Stalling
Reach 50,000+ security professionals
Sponsor a newsletter slot and put your brand in front of CISOs, engineers, and IT decision-makers.
A script that resolves a batch of hashes, IPs, and domains against VirusTotal ran cleanly in a five-IOC test and then fell over the first time it was pointed at a real day's worth of SIEM alerts. The failure mode is almost always the same: a wall of HTTP 429 responses, a pipeline that either silently drops the rest of the batch or retries in a loop that never finishes, and an analyst left wondering whether VirusTotal is down, whether the API key is bad, or whether the code is broken. None of those is usually the answer. The pipeline is working exactly as built; it is just built against a quota it was never designed to respect. This guide walks through why that happens, how to tell which of VirusTotal's three quota windows is actually being blown through, what to change in the pipeline itself, how to confirm the fix actually held, and when the honest answer is that no amount of client-side engineering fixes it and you need a different tier or a different architecture entirely.
Why the Pipeline Starts Throwing 429s
VirusTotal enforces quotas on every API key across three separate windows: a per-minute limit, a daily limit, and a monthly limit, and any one of them can trigger a 429 independent of the others. On the Public API specifically, VirusTotal documents the per-minute ceiling at 4 requests and the daily ceiling at 500 requests. That is tight enough that most automated IOC enrichment pipelines are not failing because they are unusually aggressive; they are failing because a script written and tested against a handful of manual lookups was never paced to survive a real alert volume, where a single suspicious email or a single EDR detection can generate a dozen or more IOCs (sender IP, attachment hash, embedded URLs, C2 domain, dropped file hashes) that all get submitted at once.
The most common causes behind a pipeline that used to work and now doesn't:
Subscribe to unlock Remediation & Mitigation steps
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
Diagnosing Which Quota You Actually Hit
Before changing anything, confirm which of the three quota windows is actually the constraint, because the fix is different depending on which one it is. VirusTotal's API v3 returns two distinct error codes under the same HTTP 429 status, and conflating them is the single most common reason a first attempt at a fix doesn't work.
Subscribe to unlock Remediation & Mitigation steps
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
Briefings like this, every morning before 9am.
Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.
Fixing the Pipeline
The durable fix is architectural, not a bigger retry budget. Retrying faster against a quota that resets on a UTC clock does not make more requests succeed; it just spends more of tomorrow's error budget on logging failed attempts.
Subscribe to unlock Remediation & Mitigation steps
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
What Not to Do: The Multiple-Account Anti-Pattern
It's tempting to work around a tight Public API quota by registering several free accounts and rotating keys across them to multiply the effective request budget. VirusTotal's terms explicitly prohibit registering multiple accounts to circumvent Public API limits, and this is a policy violation that risks the accounts being disabled, not a legitimate scaling technique. If the Public API's quota is structurally too small for a legitimate use case, the documented path is contacting VirusTotal about a higher quota or moving to a Premium or GTI Enterprise key, not multiplying free accounts.
Validating the Fix Actually Held
A fix that looks like it worked on the next test run and then quietly fails again during next month's alert spike hasn't been validated, it's just been re-tested at a smaller scale. Confirm the fix holds under real conditions before considering the pipeline fixed.
Subscribe to unlock Remediation & Mitigation steps
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
When These Fixes Won't Be Enough
Caching, deduplication, and pacing solve the common case: a pipeline that was simply unpaced against a real alert volume. They do not solve every case, and it's worth naming the situations where the honest answer is that the Public API is the wrong tool rather than a pipeline that needs more tuning.
Subscribe to unlock Remediation & Mitigation steps
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
Escalation Criteria: When to Move Off the Public API
Escalate to VirusTotal directly, and budget for a Premium or GTI Enterprise key, once any of the following is true rather than continuing to tune around the Public API's ceiling:
Subscribe to unlock Remediation & Mitigation steps
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
Reducing Single-Vendor Dependency
A pipeline architected around a single enrichment source is also a pipeline that inherits that one vendor's quota ceiling as a hard operational constraint. Diversifying enrichment across multiple OSINT and commercial sources, so a VirusTotal quota exhaustion degrades enrichment coverage rather than stalling the pipeline outright, is worth building into the architecture from the start rather than after the first quota-driven outage; the roundup of best OSINT tools for threat intelligence covers alternative and complementary sources worth evaluating for that redundancy.
The bottom line
A VirusTotal 429 in an automated IOC enrichment pipeline is almost never a sign that VirusTotal is broken; it's a sign the pipeline's request volume was never paced against the account's actual quota. Read the error body to tell a momentary rate spike (TooManyRequestsError) apart from an exhausted daily or monthly allowance (QuotaExceededError), because they need different fixes. Cache and deduplicate lookups before they ever reach the API, pace requests with real margin under the documented per-minute ceiling, and scope retry logic to the error that retries can actually fix. Validate the fix against a full day and a full month of real volume, not a five-minute test. When a properly paced, cached, deduplicated pipeline still hits its ceiling, that's the signal to request a higher quota or move to a Premium or GTI Enterprise key, not a reason to keep layering workarounds on the Public API, and never a reason to spin up multiple accounts to route around it. For the same 429 pattern in an identity pipeline, see this Auth0 Management API rate limit guide.
Frequently asked questions
What does a VirusTotal API 429 error actually mean?
It means the request exceeded one of VirusTotal's three enforced quota windows on that API key: per-minute, daily, or monthly. The response body distinguishes a short-term rate spike (TooManyRequestsError) from an exhausted daily or monthly allowance (QuotaExceededError), and the two need different fixes, so check the full JSON body rather than only the HTTP status code.
What is VirusTotal's Public API rate limit?
VirusTotal's own documentation states the Public API is limited to 4 requests per minute and 500 requests per day, with a monthly allowance also enforced as a third quota window. The Public API is also restricted to non-commercial use under VirusTotal's terms, separate from the numeric rate limit itself.
Will adding exponential backoff fix my 429 errors?
Only if the 429 is a TooManyRequestsError caused by a short-term burst. Backoff does very little against a QuotaExceededError tied to an exhausted daily or monthly window, since no amount of waiting within that window restores quota; the fix there is reducing request volume through caching and deduplication, or queuing the remaining work for the next reset.
Can I use multiple VirusTotal API keys to get around the rate limit?
No. VirusTotal's terms explicitly prohibit registering multiple accounts to circumvent Public API limits, and doing so risks the accounts being disabled rather than providing a sustainable workaround. If the Public API's quota is genuinely too small for a legitimate use case, the documented path is requesting a higher quota from VirusTotal or upgrading to a Premium or GTI Enterprise key.
Why did my enrichment pipeline work fine in testing but fail in production?
Testing usually runs a handful of manual lookups, which stays well under any quota. Production alert volume generates many more IOCs per event (multiple hashes, IPs, and domains per alert) submitted without caching, deduplication, or pacing, which exhausts the per-minute or daily quota almost immediately once real volume hits the pipeline.
How do I know if I need to upgrade to VirusTotal Premium?
Upgrade is the right move once a properly built pipeline (verified caching, deduplication, and request pacing with margin under the documented limit) still hits 429s regularly, once the daily or monthly window rather than the per-minute one is the binding constraint, or once the use case needs a throughput guarantee or low-latency lookups that the Public API's rate limit structurally cannot provide.
Sources & references
Free resources
Critical CVE Reference Card 2025–2026
25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.
Ransomware Incident Response Playbook
Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.
Daily briefings + Google Top Stories in one step.
Enter your email and we'll subscribe you to the daily briefing and add Decryption Digest to your Google Search feed at the same time.

Founder & Cybersecurity Evangelist, Decryption Digest
Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.
