Safeguard
Security Guides•

What should you give an API tester before they start?

Hand over a spec, request collections, test accounts per role, seeded objects and a contact. A checklist that saves days of recon and false findings.

Safeguard Security Team
7 min read

Give an API tester a machine-readable spec, saved request collections, test accounts for every role, seeded objects with their IDs, a list of hosts and versions in scope, and a named contact. Every item you withhold becomes reconnaissance time you pay for, or a gap in coverage.

Why handover matters

OWASP's reconnaissance guidance for API testing starts with finding documentation. It says to look for OpenAPI definitions, including older versions that may expose deprecated but still-working endpoints, and to ask clients for machine-readable artifacts such as OpenAPI definitions, request collection files and schemas for non-REST APIs like GraphQL. It also warns that documentation may be inaccurate or incomplete and should be verified.

Handing these over does not make the test easier on you. It moves the tester's hours from discovery to depth.

The handover checklist

ItemWhy the tester needs it
OpenAPI file or schema, current and previous versionsDefines the operations to test, and points to old ones
Request collectionsShow real working requests, headers and auth flows
Accounts: two ordinary users, a lower role, a higher roleRequired for object and function level checks
An unauthenticated baselineTo confirm what truly needs login
Seeded objects with IDs per accountLets the tester try one account's IDs as another
Hosts, environments and versions in scopePrevents testing the wrong target, or missing one
Rate ceiling and test windowKeeps the test within your limits and cloud policy
Known quirksNonces, signed requests, one-time tokens, anti-automation
Escalation contactSomeone who can pause the test

Details that save time

Signed or dynamic requests. The same OWASP guidance notes that when fuzzing authenticated APIs you must reproduce the session handling and recompute dynamic fields such as nonces or signatures on every request. If your API does this, tell the tester how, or provide a sample.

Role differences. The guidance says to browse the app with accounts at different privilege levels to expose more functionality. Provide each role with a short note on what it should and should not be able to do. That note is the expected result against which findings are judged.

Environment. Point the tester at a test environment with synthetic data when possible, and make sure integrations such as email and payments hit sandboxes.

What to hold back

Keep real customer data out of the test. Do not hand over production secrets. Create accounts and tokens just for the test, with an expiry date, and revoke them when it ends.

After the test

Ask for the requests and responses behind every finding, so your developers can reproduce them, and for a list of what was not tested. A list of untested operations is as useful as a list of findings.

Worked example: a handover pack for a subscription billing API

A company is preparing a test of its billing API. The tester starts Monday. Here is the pack the team assembles on the Friday before.

Folder contents.

FileContents
openapi-current.yamlThe spec generated from the latest release
openapi-v1.yamlThe spec for the older version still in use by two customers
collections/Saved request collections for sign-up, upgrade, cancel and invoice download
accounts.mdFour test accounts with roles, plus how to obtain tokens, stored as references to the secrets manager and not as plain passwords
seed-ids.mdSubscription and invoice IDs for each test account
environment.mdStaging hostnames, versions, rate ceiling, test window, sandbox payment details
quirks.mdNotes on signed webhooks, one-time download links and the idempotency header
contacts.mdWho can pause the test, and who to call if staging is down

The note on roles. accounts.md has a short table:

AccountRoleShould be able to
acme_ownerOwnerChange plan, cancel, view invoices
acme_memberMemberView invoices only
globex_ownerOwner at a second customerSame as above, for its own data
support_agentInternal supportView any invoice, cannot change plans

This table is the expected-results key. When the tester finds that acme_member can cancel, the table says it is a finding. Without it, the tester would have to guess whether that is intended behavior.

The quirks note. Invoice downloads return a one-time link that expires after one use. A scanner that fetches it twice gets an error the second time. The note tells the tester to ignore that behavior or fetch once per run. The idempotency header must be unique per create request, so the tester knows to generate a new value each time. This is the dynamic-field handling the recon guidance mentions.

What the team left out. No production data. No real card numbers, only sandbox values. No shared admin credentials. Test accounts expire in two weeks and will be disabled afterward.

How the tester uses it

On Monday morning the tester imports both specs, loads the collections, and signs in as the four accounts. The reconnaissance that would have taken a day is done by lunch. The tester compares the specs with traffic captured from the web app and finds a route that is in neither spec: an invoice export used by the finance team. That route becomes a priority target, found only because the time was freed up.

After the handover

Keep the pack. Next quarter, update the specs and seeds and hand the same folder to the next tester or to your own CI job. Over time the pack becomes the definition of how your API is tested.

Common mistakes in a handover

A handover goes wrong in a few repeatable ways, and each one costs the tester time.

  • A stale spec. If the spec is a year old, the tester will test the API you had, not the one you have. Generate it from the current build, and say when.
  • Credentials that do not work. Check each account yourself before the test starts. An expired password on day one wastes a morning.
  • Missing roles. If you hand over two accounts but the API has four roles, two thirds of the function level checks cannot happen.
  • No seeded data. Accounts with empty histories cannot test object access. Give each account objects of every type.
  • Hidden quirks. Signed requests, anti-automation checks and one-time tokens make a scanner look broken. Describe them.
  • No escalation path. If the tester sees something alarming, such as real customer data, they need someone to call.
  • Moving targets. A deployment in the middle of the test invalidates findings. Agree a freeze for the window.

Run a ten minute dry run before the tester starts: sign in as each account, call one route per role, and read the spec header for its date. Most handover problems appear in that ten minutes.

Try it yourself

Open the demo and imagine importing your own spec and accounts into a run like this one. Note which findings would depend on the accounts you provide.

Click through it at your own pace, or open it full screen.

Quick check

Is an OpenAPI file enough on its own?

Rarely. It shows operations, but not credentials, roles, object IDs or quirks. Without accounts the tester cannot check authorization.

Should the tester be told about old API versions?

Yes. Old versions are a common place for forgotten endpoints, and the OWASP guidance specifically points at older specs.

Should the tester get production access to speed things up?

No. Use a test environment with synthetic data. If production testing is needed, scope it narrowly, with approval, and use accounts and objects created for the purpose.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.