Docs / Surface / scan-profiles

Scan Profiles

Scan profiles let you customize scanning behavior per use case: controlling which file types are accepted, size limits, automatic threat response, and what happens when a scan completes.

Each API key is linked to a scan profile, so different keys can have different scanning rules. No middleware, no conditionals in your code; scans made with a given key automatically apply that key's profile rules.

Profile settings

In the Surface dashboard, go to Scan Profiles in the sidebar and expand any profile to edit it:

The Surface scan profile editor, expanded to show the allowed file type categories Expanding a profile reveals its settings. File types are chosen by category, not typed in.

Field Description
Name Display name
Allowed types Chosen with checkboxes, grouped by category (executables, documents, config & data, web content, archives, images, scripts). Tick a category to accept all of its extensions, or pick individual chips. Turn on Accept all file types to accept everything regardless of the selections below it
Max file size Maximum upload size in bytes. Files exceeding this are rejected before scanning
Enable payload scan Allow scanning raw text payloads under this profile (default: true)
Auto-block IP Automatically block any IP that uploads a malicious file
Webhook URL Receive scan results via HTTP POST when scans complete
Webhook API key Used for HMAC-SHA256 signature verification and optionally sent in the Authorization header

Auto-block IPs

When enabled on a profile, any IP address that uploads a file classified as malicious is automatically blocked from further uploads. 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 in the profile settings.

Reviewing blocked addresses

Blocks land on the Blocked IPs page in the sidebar, which lists every address auto-blocked for uploading a malicious file. Until you turn Auto-block IP on for at least one profile, the page stays empty.

The Surface Blocked IPs page Blocked IPs with auto-blocking not yet enabled. The page itself explains the prerequisite.

Blocked addresses are kept for your plan's retention window — see Data Retention if you need to look up why an address was blocked.

Why restrict file types?

Your users probably only need to upload a narrow set of file types: profile photos, PDFs, spreadsheets. Accepting everything means a user could upload an executable or script you never intended to receive. Restricting by type stops unexpected files before they ever reach the scanner and gives users a clear error if they accidentally select the wrong file.

Common use-case presets

Use case Suggested types
Profile photo / avatar jpg jpeg png gif webp svg
Document upload (generic) pdf doc docx xls xlsx ppt pptx txt csv rtf md
Spreadsheet / data import csv xls xlsx json xml yaml
File sharing / bundle zip pdf jpg jpeg png doc docx
Web content / templates html htm css json svg woff woff2
Email / attachments eml msg pdf doc docx xls xlsx zip
IoT / firmware bin uf2 hex
Mobile app review apk ipa
Accept all (not recommended for public uploads) The Accept all file types toggle on the profile, or the built-in All File Types profile

New accounts start with a default profile that covers images, documents, config files, web content, archives, fonts, email, firmware, and mobile packages. Executables and scripts are excluded by default.

Built-in profiles

Every account starts with three profiles:

Profile Behaviour
Default All engines enabled with standard thresholds. Payload scanning on
All File Types Accepts all file types with no size limit. All engines enabled
Agentic Tuned for AI/agent workloads: payload scanning on, prompt injection and tool call analysis engines enabled with lower thresholds

Engine configuration

Scroll down within the profile editor to the Engine Configuration section and use the toggles to choose which scan engines run for that profile. The Enable payload scanning switch above it controls whether raw text payloads can be scanned at all under this profile.

Engine configuration toggles in the profile editor

YARA and ML Classifier are core engines that always run. The toggleable engines below are for agentic/content security analysis:

Each of these engines also supports a sensitivity setting that filters what gets surfaced:

Sensitivity What it shows
strict (default) Every finding
normal High and medium severity
permissive High severity only

The detector itself always runs in full; sensitivity just post-filters the result. All engines are enabled by default.

<details> <summary>Configure via API</summary>

Each profile carries an engine_config JSON object that controls per-engine behaviour. Pair it with enable_payload_scan (boolean, default true) to toggle payload scanning per profile.

Field Type Description
enable_payload_scan boolean Enable or disable payload scanning for this profile. Default true
engine_config object Per-engine overrides. Omit a key to keep the default (enabled, strict sensitivity)
json

{
  "enable_payload_scan": true,
  "engine_config": {
    "prompt_injection":   { "enabled": true, "sensitivity": "strict" },
    "code_extraction":    { "enabled": true },
    "sensitive_data":     { "enabled": true, "sensitivity": "normal" },
    "tool_call_analysis": { "enabled": true, "sensitivity": "strict" }
  }
}

Set "enabled": false to skip an engine. code_extraction is a simple on/off toggle; the others support sensitivity.

</details>

Webhooks

Set a Webhook URL on a profile and Surface POSTs the full scan result to your server when each scan completes, signed with HMAC-SHA256. You can choose an auth type (API Key, Bearer Token, or Custom Header) and test the webhook from the profile panel before enabling it.

See Webhooks for the payload shape, signature verification examples, and handler patterns.