Base URLhttps://cull.sh/api/v1
POST

/bulk

Search up to 100 targets in one request. Add ?findings=1 for compact finding summaries.

curl -X POST 'https://cull.sh/api/v1/bulk?findings=1' -H 'Content-Type: application/json' -d '{"queries":["joomla 1.5.4","openssl 1.0.1"]}'
InputLimit
application/json{"queries":["…"]}
text/plainOne target per line.
Request100 queries · 64 KiB · 20 seconds.
GET

/wordpress

Return recent WordPress plugin, theme and core vulnerabilities from the Wordfence corpus, ordered by publication date with the newest disclosure first. Vector and severity parameters explicitly narrow that chronological stream.

curl 'https://cull.sh/api/v1/wordpress?window=7&limit=25'

The default filter is the one the homepage panel starts from: reachable over the network, requiring no privileges, scoring high or critical. Pass a parameter empty to clear that half of it: vector= drops the metric filter, and severity=any drops the band.

ParameterMeaning
windowDays back to consider, 1 to 180. Default 30.
limitRecords to return, 1 to 100. Default 100.
vectorComma-separated CVSS base metrics that must all be present, such as AV:N,PR:N. Default AV:N,PR:N. A record carrying no vector matches no metric filter.
severityany, low, medium, high or critical, meaning that band and above. Default high. Anything but any excludes records with no score.
FieldMeaning
accessWhat the attacker needs: unauthenticated, low-privilege (subscriber or customer), granted-role (contributor, author, editor, shop manager), administrator, or unstated when the record does not say.
impactThe weakness in the same vocabulary the primitive: filter searches, derived from cwe.
unpatchedWordfence names no fixed version for the affected range, so updating cannot bring an installation out of it.
uncataloguedNo CVE was ever assigned. Roughly one record in fourteen, carried by Wordfence and by nobody else.
rankPosition in this filtered, newest-first response.
cvss_vectorThe base vector the score came from, as the source stated it. This is what vector is matched against.
filterThe filter that produced the response, so a caller relying on the defaults can read what they were.

Rank one is the newest disclosure matching the requested filters. It does not say that any particular site is affected; resolve a version with /search for that.

Finding filters

Research directives can be written directly in q or supplied as repeatable filter parameters. Separate directives use logical AND and are applied before totals, sorting and cursor pagination. Every query inside a bulk request accepts the same syntax.

curl -G 'https://cull.sh/api/v1/search' \
  --data-urlencode 'q=openssl 1.0.1' \
  --data-urlencode 'filter=is:kev' \
  --data-urlencode 'filter=cvss:>=7' \
  --data-urlencode 'filter=vector:AV:N' \
  --data-urlencode 'filter=vector:PR:N'
FilterDirectives
Signalsis:kev, is:exploit, is:needs-review
Exploit typetool:metasploit, tool:nuclei, tool:exploit-db, tool:unverified-poc, tool:unreviewed-exploit. A comma-separated list matches any named type.
Scores and datescvss:>=7, epss:>=10%, published:>=2025-01-01
Fix and certaintyfixed:true, fixed:false, certainty:certain, certainty:uncertain
CVSS base vectorvector:AV:N, vector:AC:L, vector:PR:N, and the other CVSS v2, v3 and v4 base metrics. Repeat to combine metrics.
Attack primitivehas:primitive, primitive:CWE-22, primitive:"path traversal"

Result status

AFFECTEDConfirmed applicable findings.
NOT_AFFECTEDTarget resolved; no applicable finding remains.
UNKNOWN_OR_UNCHECKEDRelevant evidence could not be decided safely.
UNRESOLVEDNo product was resolved.

Rate limits

No captcha and no key. Limits are per IPv4 address or IPv6 /64, and a bulk request counts as one request per query it carries. Every 429 and 503 carries a Retry-After header. Treat that header as part of the API contract: wait at least the stated number of seconds before sending the next request.

A wider set of dynamic rate limits and abuse-detection systems is active. Clients that ignore the limits and continue abusive traffic receive an IP ban. So don't do stupid shit.

LimitValueOn breach
Per-IP request rate100 requests / second429, immediate
In flight per client8 concurrent requests429, immediate
Shared work poolqueues a burst briefly503 if still full

HTTP

200 success400 invalid request403 rejected request413 request too large429 rate limited500 internal error503 temporarily unavailable504 timeout