# BugRater for developers and agents

> BugRater rates bug bounty and vulnerability disclosure programs from researcher reviews, and tracks what the platforms publish: payouts by severity, response targets, 90-day intake, structured scope, launches and accepted findings. Everything below is generated from the live configuration on October 22, 2026.

Agents: the MCP server at https://bugrater.com/mcp is the easiest way in, and needs no account. Before testing any asset, call `check_scope`; BugRater's copy of scope is dated, and the program's policy page is the authority.

## Authentication

- **Open:** No credentials.
- **Token:** Authorization: Bearer <token>. A personal agent token (bra_live_…) from /settings/agents, or an API key.
- **Attack Surface:** X-API-Key with an Attack Surface key, or pay per call with x402 (no account) when x402 is on.
- **MCP:** Optional Authorization: Bearer agent token; OAuth on /mcp/account.

## MCP server

The easiest way in for an agent. Streamable HTTP, protocol versions 2025-03-26 through 2026-07-28, no account needed for public data. Setup for each client: https://bugrater.com/agents. The tools are listed in full in https://bugrater.com/llms-full.txt.

### `POST /mcp`

MCP endpoint. Public tools without a token; member tools with one.

JSON-RPC 2.0. Anonymous callers get 40 tool calls a minute per address, token holders 120.

```sh
claude mcp add --transport http bugrater https://bugrater.com/mcp
```

### `POST /mcp/account`

The same server for a signed-in member. Without a token it answers 401 with OAuth metadata, so clients offer sign-in.

```sh
claude mcp add --transport http bugrater https://bugrater.com/mcp/account
```

## Open lookups

Small public checks that need no credentials at all.

### `GET /api/v1/cve/{cve}`

Is this CVE in the named program's own published advisories?

- `cve` (path, string, required): e.g. CVE-2026-12345
- `program` (query, string, required): Program slug to check the CVE against.

Returns:

- `verdict`: matched, mismatch (credited to another vendor), unknown, or malformed
- `vendors`: Vendors BugRater has it credited to
- `release`: The advisory, when matched

```sh
curl 'https://bugrater.com/api/v1/cve/CVE-2026-12345?program=gitlab'
```

### `GET /api/v1/researcher-credits`

Every published vendor-advisory credit for a researcher name.

- `name` (query, string, required): The name as advisories credit it.

Returns:

- `total`: credits, cves, vendors, first and latest date
- `byVendor`: Per-vendor counts
- `cves`: Up to 30 most recent CVEs
- `profile`: The BugRater member, when the name is a verified claim

```sh
curl 'https://bugrater.com/api/v1/researcher-credits?name=Jane%20Doe'
```

### `GET /api/v1/verify/{token}`

Verify a BugBadge attestation attached to a report.

- `token` (path, string, required): The 40-character attestation token.

Returns:

- `status`: valid, expired, revoked or badge_revoked
- `researcher`: username, profile and badge links
- `snapshot`: The track record at minting time
- `minted_for`: The program it was minted for; check it is yours
- `distinct_verifiers`: How widely the token has travelled

```sh
curl https://bugrater.com/api/v1/verify/0123456789abcdef0123456789abcdef01234567
```

### `GET /api/v1/keys/{username}`

A member's published end-to-end public key (P-256 JWK) and fingerprint, to encrypt collab content to them.

- `username` (path, string, required): BugRater username.

## Directory API

Programs, grades and reviews as JSON. Self-serve: create an agent token at https://bugrater.com/settings/agents and send it as a bearer token. 60 requests a minute.

### `GET /api/v1/programs`

Every program, best graded first.

- `limit` (query, integer): Rows to return, 1 to 100. Default 50.
- `offset` (query, integer): Rows to skip. Default 0.

Returns:

- `data[]`: slug, name, company, platform, type, bounty_low, bounty_high, grade, score, reviews, url
- `total, has_more`: For paging

```sh
curl -H 'Authorization: Bearer $BUGRATER_TOKEN' 'https://bugrater.com/api/v1/programs?limit=20'
```

### `GET /api/v1/programs/{slug}`

One program with its review metrics, reported practices and up to 100 reviews.

- `slug` (path, string, required): Program slug, as in /programs/{slug}.

Returns:

- `data.metrics`: would_submit_again_pct, would_recommend_pct, avg_skill, median_first_response, sentiment
- `data.reported_practices`: Practice flag counts
- `data.reviews[]`: Review text, ratings, outcomes; anonymous authors are null

### `GET /api/v1/rankings`

Graded programs ranked on one board.

- `board` (query, string): graded (default), triage, payers or cves.
- `limit` (query, integer): Rows to return, 1 to 100. Default 50.
- `offset` (query, integer): Rows to skip. Default 0.

### `GET /api/v1/stats`

Site-wide totals and the grade distribution.

### `GET /api/v1/reviews/{id}`

One approved review.

- `id` (path, integer, required): Review id.

## Attack Surface API

Enumerated subdomains, HTTP probes and exposure signals per program, priced per call. Pay with an Attack Surface subscription key (https://bugrater.com/attack-surface). Paying per call with x402 is switched off for now, so every call needs a key. Full field lists: https://bugrater.com/attack-surface/api-docs.

### `GET /api/v1/surface/programs`

The board: every rated program with its rating, surge and crowd read. Price: $0.50 per call.

- `sort` (query, string): score (default), surge, velocity or hunters.
- `page` (query, integer): Default 1.
- `limit` (query, integer): Default 50.

### `GET /api/v1/surface/movers`

What is heating up, and what is under-hunted while still active. Price: $0.50 per call.

### `GET /api/v1/surface/signals`

The freshest high-value signals across every program. Price: $0.50 per call.

- `type` (query, string): A signal type, e.g. staging_env, exposed_config, login_page or admin_panel. An unknown type is a free 400 that lists the valid ones.
- `severity` (query, string): info, low, medium or high.
- `page` (query, integer): Default 1.
- `limit` (query, integer): Default 50.

### `GET /api/v1/surface/programs/{id}`

One program: rating and drivers, market read, enumeration depth. Price: $0.75 per call.

- `id` (path, integer, required): Attack Surface program id, from /api/v1/surface/programs.

### `GET /api/v1/surface/programs/{id}/subdomains`

Enumerated subdomains with DNS, liveness and attached signals. Price: $1.00 per call.

- `id` (path, integer, required): Attack Surface program id, from /api/v1/surface/programs.

```sh
curl -i https://bugrater.com/api/v1/surface/programs/42/subdomains -H 'X-API-Key: bsk_live_…'
```

### `GET /api/v1/surface/programs/{id}/probes`

HTTP probes: status, title, server, tech fingerprint, TLS issuer. Price: $0.50 per call.

- `id` (path, integer, required): Attack Surface program id, from /api/v1/surface/programs.

### `GET /api/v1/surface/programs/{id}/signals`

Exposure signals on one program, highest severity first. Price: $0.75 per call.

- `id` (path, integer, required): Attack Surface program id, from /api/v1/surface/programs.

### `GET /api/v1/surface/programs/{id}/velocity`

Daily intake series. Price: $0.50 per call.

- `id` (path, integer, required): Attack Surface program id, from /api/v1/surface/programs.
- `days` (query, integer): Window, default 90.

### `GET /api/v1/surface/programs/{id}/full`

Everything for one program in a single call. Price: $2.00 per call.

- `id` (path, integer, required): Attack Surface program id, from /api/v1/surface/programs.

## Sign-in for MCP clients

OAuth 2.1 as the MCP authorization spec profiles it: dynamic client registration, public clients, PKCE S256. Clients discover all of it from the 401 on /mcp/account.

### `GET /.well-known/oauth-protected-resource`

Protected resource metadata (RFC 9728). Also at /mcp and /mcp/account suffixes.

### `GET /.well-known/oauth-authorization-server`

Authorization server metadata (RFC 8414).

### `POST /agents/oauth/register`

Dynamic client registration (RFC 7591). Public clients only.

### `GET /agents/oauth/authorize`

Authorization endpoint. The member signs in and consents.

### `POST /agents/oauth/token`

Code exchange with code_verifier. Returns a 90-day bearer token.

## Paying with x402

x402 pay-per-call is not switched on for this deployment yet; Attack Surface calls need a subscription key.

1. Call a paid endpoint with no key. It answers 402 Payment Required with a PAYMENT-REQUIRED header (x402 v2, base64 JSON) and the v1 offer in the body.
2. Sign an EIP-3009 USDC authorisation for exactly the amount in accepts[0], to its payTo.
3. Repeat the request with PAYMENT-SIGNATURE (v2) or X-PAYMENT (v1). BugRater verifies it, settles it on chain through the facilitator, and answers 200 with PAYMENT-RESPONSE carrying the transaction.
4. Each authorisation buys one response. A replay is refused, and nothing is delivered unless settlement succeeds.
5. Over MCP, the attack_surface tool does the same: its first answer is the PaymentRequired object, and the retry carries the payment in _meta["x402/payment"]. The settlement comes back in result._meta["x402/payment-response"].

## Limits and errors

- Every error is JSON with `ok: false` and an `error` sentence that says what to change.
- 400 bad filter, 404 not found and an empty answer are never charged. 401 missing or invalid credentials; 402 payment required; 429 rate limited, with Retry-After.
- MCP tool failures come back as tool results with `isError: true`, written for the model to act on.

## Where the data comes from

Reviews and grades are BugRater's, from researchers, graded only once three distinct researchers have reviewed a program. Scope, payouts, intake and response targets are the platforms' own published figures, copied on the date each answer gives. Accepted findings come from the platforms' public feeds, which are samples. CVE credits come from published vendor advisories.

## More

- Connect an agent: https://bugrater.com/agents
- OpenAPI: https://bugrater.com/openapi.json
- Short index: https://bugrater.com/llms.txt
- Terms: https://bugrater.com/terms
- Privacy: https://bugrater.com/privacy
