> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.portreeve.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.portreeve.com/_mcp/server.

# Portreeve documentation

Portreeve is an abuse firewall for SaaS signups, trials, checkouts, and logins:
one API call per screened action, one verdict back — `allow`, `review`, or
`block` — with the reasons behind it. This page is the map; each section below
is a short, self-contained guide.

## Start here

| Guide | What you'll do |
|---|---|
| [Get set up in five minutes](/get-started/quickstart#get-set-up-in-five-minutes) | Account → test key → first verdict via `curl` → see it in the dashboard. |
| [Install the SDK](/integration/keys-first-verdict#install) | `npm install portreeve`. Zero runtime dependencies. |
| [First verdict — Next.js](/integration/keys-first-verdict#first-verdict) | A complete signup route handler. |
| [First verdict — Express](/integration/keys-first-verdict#first-verdict) | The same screening as reusable middleware. |
| [Device fingerprinting](/integration/device-fingerprinting) | The browser snippet. Not optional if you take payments. |
| [Test mode](/integration/test-mode-feedback#test-mode) | Verify the integration end to end before going live. |

## Integrate

| Topic | Covers |
|---|---|
| [Keys](/integration/keys-first-verdict#keys) | Secret vs publishable, live vs test, where they live. |
| [What to send per event type](/integration/event-payloads) | Canonical payloads, the required-fields matrix, signals that go dark without a field. |
| [Failure behavior](/integration/keys-first-verdict#client-options-and-failure-behavior) | Fail-open by default, `degraded` results, safe retries. |
| [Feedback](/integration/test-mode-feedback#reporting-outcomes-back-feedback) | Reporting confirmed abuse and false positives back to the graph. |

## Enforce

| Topic | Covers |
|---|---|
| [Handling verdicts](/reference/handling-verdicts) | The one page to read fully: `review` never blocks, and what that means for your code. |
| [The `review.resolved` webhook](/reference/handling-verdicts#the-reviewresolved-webhook) | Signature verification, revocation, retries. |
| [Checkout patterns](/reference/handling-verdicts#checkout-two-enforcement-patterns) | Capture + refund vs Stripe manual capture, and when to pick which. |
| [Fail-open vs fail-closed](/reference/handling-verdicts#fail-open-and-when-to-fail-closed) | When blocking on our outage is the right trade. |

## Reference

| Topic | Covers |
|---|---|
| [REST API](/reference/rest-api) | Endpoints, an example call, and the stored-event payload. |
| [Rate limits](/reference/rest-api#rate-limits) | Per-key budgets and what a `429` means. |
| [Idempotency](/reference/rest-api#idempotency-and-409-idempotency_conflict) | Safe retries and the one way to get a `409`. |
| [Errors](/reference/rest-api#errors) | Every error code the API returns. |
| [Reason codes](/reference/reason-codes) | Every code a verdict can carry, grouped by signal family. |

## Support

Email [admin@portreeve.com](mailto:admin@portreeve.com) — you're talking to the
founder, and anything wrong or unclear in these docs gets fixed fast.