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

Uploads are the front door

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.

DIY scanning is a project

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.

False positives break your product

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.

Attackers retry

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.

1

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.

2

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.

Scan an upload
curl -X POST https://app.tendrl.com/surface/api/scan \
  -H "Authorization: Bearer $SURFACE_KEY" \
  -F "[email protected]"
The verdict (trimmed)
{
  "name": "upload.pdf",
  "safetyScore": {
    "score": 95,
    "threatLevel": "Clean",
    "confidence": "High",
    "recommendedAction": "Allow",
    "coverage": "full"
  }
}
3

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.

4

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.

5

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.

Async for large files
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

Fast enough for the critical 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.

Detection you can check

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.

Archives handled properly

ZIP, RAR, 7-Zip, and tar are unpacked and every entry is scanned individually. One archive counts as one scan against your quota.

A memory of bad actors

Auto-block IP, on Standard and Pro, turns repeated malicious uploads into an automatic block list, enforced before the next upload is even read.

Private by design

Files are scanned in memory and discarded. Surface keeps verdicts, metadata, and content hashes, never the file itself.

Free to start

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.

User Uploads a file
Your backend Receives to temp
Surface Scan + verdict
Your storage Accept / quarantine / reject
Ingest

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.

Verdict

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.

Enforcement

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.