Security scan, access matrix and webhook inbox
Scan a project for security gaps, check who can reach what, catch webhooks and try bad inputs. "Test" › "Security" and "Build" › "Mocks, streams & docs" hold them.
In short
The project-wide tests beyond plain checks live in two views. "Security", under "Test", opens on "Results" - one list of what every check found - and holds a security scan of your saved requests and an access matrix that sends the same requests as different people. "Mocks, streams & docs", under "Build", holds the webhook inboxes that catch what other services send, with the mock server, streams, MCP servers and published docs. "Try bad inputs" is on a request. Heavy and active tests run only against a site you proved is yours.
Before you start
- Who: a security scan needs Edit on the project. Creating or deleting a webhook inbox needs Manage. Proving a site needs the right to manage the workspace's settings.
- Plan: every plan. Each request these tests send counts toward your allowance.
- First: for active checks and bad inputs, prove the site is yours (Settings › "Verified sites").
See every result in one list
- Open "Test", choose "Security" and choose a project. It opens on "Results".
- Read each row, newest first: the check - "Security scan", "Who can do what" or "Robustness" - with its environment, what it found and when. "Nothing found" is clear; "2 to look at" and "3 found" need you.
- Click a row's name to open it where it lives: a scan or a matrix opens its own tab, and bad inputs open their request.
With nothing run yet it says "No results yet" and offers "Run a security scan".
Run a security scan
- Open "Test", choose "Security", choose a project and open "Security scan".
- Press "Scan this project".
- Read what it found by severity (High, Medium, Low, Info), each with its OWASP API Security item and how to fix it.
- To go further, switch on "Active checks" - it also tries methods such as TRACE and replays requests without their credentials, on proved hosts only.
One scan checks up to 25 of the project's saved GET and HEAD requests - never a request that changes data. It looks for:
- Answers without any credentials, and answers that are the same with or without them.
- Cross-origin settings that let any site read answers, especially with a visitor's cookies.
- Missing security headers: Strict-Transport-Security, X-Content-Type-Options, Content-Security-Policy and frame protection.
- Cookies without Secure, HttpOnly or SameSite.
- Stack traces and verbose errors, server versions, plain HTTP.
- Secrets in answers: tokens, cloud access keys, private keys, card numbers and password fields.
- A certificate that is not trusted or expires within 30 days.
Prove a site is yours
- Open Settings, then "Verified sites", and press "Prove a site".
- Enter the site's address, such as https://api.example.com. A proof covers that host and port only.
- Press "Get a token".
- Put the token on the site: serve a file at the address shown with the token as its whole text, or send the header shown from the site's root page.
- Press "Verify now".
A proof lapses 30 days after its last check, so keep the token on the site; Settings warns you before it lapses. The proof is checked again every time a heavy test starts, and the test connects only to the address the proof was fetched from. Only people who manage the workspace's settings can add or remove a proof.
Who can do what
- In "Security", open the "Who can do what" part and press "New access matrix".
- Choose the requests, the people (each authentication profile is one person or role; add "Nobody signed in" as another), and an environment.
- Press "Save matrix", then click a cell to say what should happen: "In" (let in) or "Out" (kept out).
- Press "Run the matrix".
Each cell shows what happened: let in, refused (401 or 403), hidden (404), another 4xx, a server error, no answer or not sent. A cell is flagged only against what you expected - most of all "let in but should be kept out", such as one user reading another's records.
Webhook inbox
- Open "Build", choose "Mocks, streams & docs" and open "Webhook inboxes". Press "New inbox" and give it a name such as Payment events.
- Press "Copy address" and paste it into the other service. Only people who manage the project see the address.
- Watch the requests appear as they arrive: method, path, query, headers and body.
- To make a suite wait for one, edit a step and switch on "Wait for a webhook after this step". Then choose the inbox, optionally a method, text the path or body must contain, and how long to wait (up to 60 seconds).
The step passes only when a matching request arrives after the step started.
- Open the inbox and press "Add a schema". You need to manage the project.
- Paste a JSON Schema and save. Every request the inbox keeps is checked, and so is every one that arrives after.
- Each request now says "Fits" or "Does not fit". Open one that does not fit to read where.
- To make a suite step count only a request that fits, switch on "It must fit the inbox's schema" on that step.
- Open a received request and press "Send again". You need to be able to edit the project.
- Give the address to send it to, then press "Send".
- Read the status and the time it took. It counts as one send, like any other.
Its method, headers and body are sent as they arrived. Credentials were masked when it arrived, so they are not sent. A request with a binary body cannot be sent again.
Try bad inputs
- Open a saved request's "Bad inputs" tab, or "Try bad inputs" in its menu.
- Read the verdict for each of up to 40 inputs the API should refuse. They include an empty body, broken JSON, a wrong type, a missing required field and a null. They also include values out of range, text that is too short, too long or oversized, and a value that is not allowed.
Good to know
- These tests send real requests. Passive checks send each request once, like a normal run. Active checks and bad inputs run only against a proved site; for any other host the scan says "Passive only", with a "Prove this site" link.
- The scan keeps the finding, where it was seen and its parameters - never a body or a secret it found. Earlier scans are listed for 90 days. Each request sent counts against your API requests.
- A matrix holds up to 50 requests, 10 people and 200 cells in one run, and every cell is a counted request. "Nobody signed in" is expected to be kept out unless you say otherwise. A deliberate refusal never turns a saved request red.
- An inbox receives for 7 days, a workspace can have five open, and an inbox keeps the latest 500 requests for 3 days. Credentials in headers and the query are masked, and a body is shown as text only, never run. Deleting an inbox stops its address and deletes what it received.
- Try bad inputs needs a documented body schema (imported from OpenAPI). A GET or HEAD request's inputs go out as a POST to the same address. Each input counts as a request.
- Mock servers, streams, MCP servers and published docs, beside the inboxes under "Mocks, streams & docs", have their own guides: /help/api-testing/mock-servers, /help/api-testing/stream-sessions and /help/api-testing/mcp-servers.
If something goes wrong
- "Passive only": the host is not proved. Prove it in Settings, Verified sites.
- The proof does not verify: check the file or header holds exactly the token, at the address shown, then "Verify now" again.
- "This project has no GET or HEAD request with a public address to scan."
- "This request has no documented body schema to generate inputs from. Import it from OpenAPI, or add a schema check."
- "Confirm your email address first - an inbox is a public address anyone can send to."
Related
- /help/api-testing/mock-servers
- /help/api-testing/load-testing
- /help/settings/webhooks-and-site-ownership