Directus Security Scanner — Find public-role collection leaks
Pricing
Pay per usage
Directus Security Scanner — Find public-role collection leaks
Probes a public Directus instance for misconfigured Public-role permissions. Detects collections readable without auth via /items/{collection}. Returns counts + curl reproducer. Counts only. -- By Renzo Madueno, https://rotatepilot.com
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Renzo Madueno
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Directus ships with a "Public" role enabled by default, and the only thing keeping your collections private is the read permissions assigned to it. Most operators tighten Public on their main content collections but forget the internal ones —
directus_users,directus_files, and any custom table created via the admin UI. This actor finds those leaks in 30 seconds.
Probes a public Directus instance for collections readable by the Public role. Sends /items/{collection}?limit=1&meta=total_count per collection. Returns row counts + a verbatim curl reproducer per finding. Counts only — never row data.
💸 Found a leak? I do turnkey Directus audits + Public-role hardening for $99 (Stripe — 48h, money-back if nothing actionable). Or $29/mo weekly auto-scans at rls-monitor.vercel.app.
⭐️ Solo dev competing with bigger Apify publishers. A 30-second review is the single thing that lifts ranking. Thank you.
Why this exists
Directus's REST API exposes every collection at /items/<name>. The Public role's read permission is what decides who can list a collection without authenticating. Most Directus tutorials walk through enabling Public read on a demo collection (e.g., articles) and then forget to mention that the Public role persists across schema changes — so when you add a new collection it inherits no permission, but the patterns established by tutorial code often grant Public access opportunistically.
The biggest landmines:
directus_users— if Public read is on, every internal user's email, role, status, and login token field metadata is listabledirectus_files— file metadata + download URLs leak even when individual files require auth- Custom collections cloned from a "public" template — the Public-role read permission carries over silently
This scanner probes ~35 collection names (common business names plus Directus system tables) plus any you pass as hints.
How to run
Either:
- Leave inputs empty + click Run for a DEMO sample report
- Provide your
directusUrlto scan your actual instance
{"directusUrl": "https://directus.your-domain.com","collectionHints": ["my-custom-collection"],"outputFormat": "both"}
What you get
- HTML report in the run's key-value store: severity-coded findings, copy-pasteable
curlreproducers, exact Directus admin steps to fix - Dataset rows: one structured row per finding
Sample finding
[CRITICAL] directus_users — readable by Public roleTotal records: 1,284Sample columns: id, first_name, last_name, email, password, role, status, token, last_accessSensitive columns detected: email, password, tokenReproducer:curl 'https://directus.your-domain.com/items/directus_users?limit=1' -I
How to fix (free, ~5 min)
- Open Directus admin → Settings → Access Control
- Click the Public role
- For each leaky collection, set the
readpermission to No Access - Click Save on each change
- Re-run this scanner to confirm zero anon-readable collections
If a collection should be public (blog content, marketing pages), set read to Custom Access and use field-level rules to hide sensitive columns from anon responses.
Ethical use
- Only scan instances you own or have explicit permission to scan
- Probe queries use
?limit=1&meta=total_countto confirm exposure without exfiltrating contents
FAQ
How do I check if my Directus collections are readable by the Public role?
Provide your directusUrl (and optionally collectionHints for custom collections) and run the actor — or leave inputs empty for a demo report. In about 30 seconds it probes ~35 collection names, including Directus system tables, and lists every collection the Public role can read, with record counts and a curl reproducer.
Do I need an API key to run this?
No. The scanner tests what an unauthenticated visitor can read via /items/<collection>, so it needs only your Directus URL. No admin token, static token, or login is required.
Why use this scanner instead of checking Access Control in the Directus admin manually?
The admin panel shows the Public role's permissions, but it's easy to miss that the Public role persists across schema changes and that a custom collection cloned from a public template inherited read access. This actor makes real unauthenticated requests and proves which collections actually leak — honestly, review the panel too, but only the live probe confirms real exposure of system tables like directus_users.
What are the alternatives to this Directus scanner? If you use a different backend, the sister scanners cover it: Supabase, Firebase, Convex, and Appwrite.
What vulnerabilities does it check for?
It detects collections readable by the Directus Public role — including high-risk system tables directus_users (emails, password/token field metadata) and directus_files (file metadata and download URLs) — plus custom collections that silently inherited Public read, and flags sensitive columns (email, password, token, etc.).
Is the scan safe and read-only?
Yes. It issues only ?limit=1&meta=total_count read probes to confirm exposure and read the record count — it never writes, deletes, or pulls bulk data. It surfaces totals and sample column names, not your records.
Automate it
Public-role permissions persist across schema changes, so a new collection or a cloned template can quietly become readable long after launch. Use Apify's scheduler to re-scan your Directus instance nightly or weekly, then connect the output via Apify integrations — Slack, Make, n8n, Zapier, or a webhook — to alert your team the moment a Public-readable collection appears. Recurring audits turn a one-time check into continuous monitoring.
Related
- Stripe audit ($99 one-time): buy.stripe.com/00w9AT9TWdaW7yx9KkcAo01
- Weekly auto-scans ($29/mo): rls-monitor.vercel.app
Related actors
- Supabase Security Auditor — Detect Row-Level-Security misconfigurations and anon-readable tables in Supabase projects.
- Firebase Security Scanner — Find public Firestore collections and Realtime Database paths readable without auth.
- Convex Security Scanner — Find Convex queries that return data without an auth check.
- Appwrite Security Scanner — Find Appwrite collections readable by the guest/
anyrole. - Multi-Scraper MCP — Give an AI agent live web-data tools alongside your security workflows.
Built and maintained by Renzo Madueño, founder of Rotate Pilot, aviation exam-prep software. More tools on GitHub.


