Use Case
Scan every upload before your app trusts it
Avatars, PDFs, resumes, CSVs, attachments: if users can upload it, attackers will too. Surface puts one API call between receiving a file and accepting it. Most verdicts come back in under half a second, archives are opened and scanned entry by entry, and the IPs that send malware can be blocked automatically.
The problem with accepting files from strangers
A webshell named like an image, an Office document with a hostile macro, an executable wearing a fake extension. The upload form is the oldest route into a web application, and it still works.
Running your own antivirus infrastructure means signature updates, archive handling, timeout tuning, and a server to babysit. Most small teams look at that list and ship without scanning at all.
An enterprise scanner that quarantines a customer's legitimate invoice is a support ticket and a lost upload. A scanner in your product's critical path has to be right when it says no.
Rejecting one malicious file doesn't stop the sender from trying ten more. Without a memory of bad actors, your upload endpoint fights the same attacker fresh every time.
How Surface solves it
One POST between "file received" and "file accepted". Signatures, per-format ML, live threat feeds, and behavioral analysis run in parallel; you get back a score and an action.
Create a scan profile
A profile defines what your endpoint accepts: allowed file types, a size cap, and engine sensitivity. The built-in Default profile deliberately excludes executables and scripts, so an .exe upload to an avatar endpoint is rejected before a single engine runs. One thing worth knowing: a "type not allowed" rejection is a policy decision, not a scan verdict.
POST the file before you accept it
One multipart request from your backend, any language. Files over 25 MB defer automatically, and you poll or get a webhook. Free and Starter cap uploads below that, so deferral starts on Standard.
curl -X POST https://app.tendrl.com/surface/api/scan \
-H "Authorization: Bearer $SURFACE_KEY" \
-F "file=@upload.pdf" {
"name": "upload.pdf",
"safetyScore": {
"score": 95,
"threatLevel": "Clean",
"confidence": "High",
"recommendedAction": "Allow",
"coverage": "full"
}
} Wire the verdict into your accept path
Scores of 0–30 are Malicious: reject and delete the temp file. 31–70 is Suspicious: hold it in quarantine until someone looks. Above 70 proceeds. Archives count as one scan but every entry inside is scanned individually, so a ZIP with one bad file in it fails as a whole.
Check coverage alongside the verdict. It says how far analysis reached for that format: full for Windows and Linux executables, partial for scripts, documents and archives, minimal for formats with no ML model behind them — Java bytecode, JARs, APKs and Mach-O. A minimal scan never returns Clean; the most it claims is Informational, because "we looked and found nothing" is a weaker statement than "this is clean" when the format is one we cannot analyze deeply. If you accept those types, treat Surface as one layer.
Auto-block repeat offenders
Turn on Auto-block IP in the profile and any IP that uploads a file classified malicious is blocked from further uploads, with the list visible on the Blocked IPs page. This is the kind of threat response logic that normally takes days to build (rate limiting, block lists, enforcement middleware), and it is a single checkbox on a Standard or Pro plan.
Scale it your way
Add ?defer=true for async scanning on high-throughput endpoints (a Standard or Pro plan feature; files over 25 MB defer automatically on any plan), receive signed webhooks (HMAC-SHA256) at your own endpoint when scans complete, or skip the backend work entirely and drop the embeddable scan widget into your page with two lines of code.
curl -X POST "https://app.tendrl.com/surface/api/scan?defer=true" \
-H "Authorization: Bearer $SURFACE_KEY" \
-F "file=@large_archive.zip"
# 202 Accepted: poll GET /api/scan/{scanId} or wait for the webhook Built for the upload path
Typical scans finish in under half a second; measured runs put a 50 KB binary at 20 ms and a 100 KB document at 30 ms. Known-bad hashes return in milliseconds.
Models are self-tested against real malware they never saw in training, and every version must clear a minimum catch rate before it ships. Our strongest, independently measured numbers are on native executables — around 99% on Windows PE and Linux ELF malware held out from training. JavaScript now has a dedicated model too, trained on real malicious JS against benign JS from popular npm packages, whose strength is a very low false-positive rate on ordinary scripts. Documents, PDFs, other scripts, and archives are best-effort: caught by ML, pattern rules, threat feeds, and structural checks, and tuned above all to keep false positives near zero so ordinary uploads are not blocked. We publish per-format catch rates only where we can back them; the rest is written up plainly in detection coverage.
ZIP, RAR, 7-Zip, and tar are unpacked and every entry is scanned individually. One archive counts as one scan against your quota.
Auto-block IP, on Standard and Pro, turns repeated malicious uploads into an automatic block list, enforced before the next upload is even read.
Files are scanned in memory and discarded. Surface keeps verdicts, metadata, and content hashes, never the file itself.
100 scans per month, up to 10 MB per file, no credit card. Enough to put your real upload flow behind a scanner today.
Example: a guarded upload endpoint
One extra hop between receiving and storing.
Your backend holds the upload in temp storage and POSTs it to /api/scan. The profile linked to your API key decides allowed types and size caps before any engine runs.
Score, threat level, and a recommended action come back in one response, with a confidence rating that tells you whether to auto-enforce or route to review.
Clean files move to permanent storage. Suspicious files wait in quarantine. Malicious files are deleted, the uploader's IP can be auto-blocked, and the whole history is in your dashboard.
Put a scanner behind your upload form today
The free tier includes 100 scans per month, up to 10 MB each. No credit card required.
Tendrl