Early access. The directory is still filling out, and every rating here comes from a researcher's reported experience.

BugRater for developers and agents

Program ratings, platform metrics, structured scope and attack surface data, over MCP or plain HTTP. Public data needs no account. Agents should start with the MCP server and call check_scope before testing anything.

/openapi.json
OpenAPI 3.1 for the REST API, for importers and tool builders.
/llms.txt
The short index, in the llms.txt format.
/llms-full.txt
This page plus every MCP tool's full description and input schema, in one file.
/docs.md
This page as Markdown. Program pages have Markdown versions too, at the same URL with .md added.

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 Optional token

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.

claude mcp add --transport http bugrater https://bugrater.com/mcp
POST /mcp/account Optional token

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

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} Open

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
curl 'https://bugrater.com/api/v1/cve/CVE-2026-12345?program=gitlab'
GET /api/v1/researcher-credits Open

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
curl 'https://bugrater.com/api/v1/researcher-credits?name=Jane%20Doe'
GET /api/v1/verify/{token} Open

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
curl https://bugrater.com/api/v1/verify/0123456789abcdef0123456789abcdef01234567
GET /api/v1/keys/{username} Open

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 Token

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
curl -H 'Authorization: Bearer $BUGRATER_TOKEN' 'https://bugrater.com/api/v1/programs?limit=20'
GET /api/v1/programs/{slug} Token

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 Token

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 Token

Site-wide totals and the grade distribution.

GET /api/v1/reviews/{id} Token

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 Key or x402 $0.50 per call

The board: every rated program with its rating, surge and crowd read.

  • sort query, string score (default), surge, velocity or hunters.
  • page query, integer Default 1.
  • limit query, integer Default 50.
GET /api/v1/surface/movers Key or x402 $0.50 per call

What is heating up, and what is under-hunted while still active.

GET /api/v1/surface/signals Key or x402 $0.50 per call

The freshest high-value signals across every program.

  • 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} Key or x402 $0.75 per call

One program: rating and drivers, market read, enumeration depth.

  • id path, integer, required Attack Surface program id, from /api/v1/surface/programs.
GET /api/v1/surface/programs/{id}/subdomains Key or x402 $1.00 per call

Enumerated subdomains with DNS, liveness and attached signals.

  • id path, integer, required Attack Surface program id, from /api/v1/surface/programs.
curl -i https://bugrater.com/api/v1/surface/programs/42/subdomains -H 'X-API-Key: bsk_live_…'
GET /api/v1/surface/programs/{id}/probes Key or x402 $0.50 per call

HTTP probes: status, title, server, tech fingerprint, TLS issuer.

  • id path, integer, required Attack Surface program id, from /api/v1/surface/programs.
GET /api/v1/surface/programs/{id}/signals Key or x402 $0.75 per call

Exposure signals on one program, highest severity first.

  • id path, integer, required Attack Surface program id, from /api/v1/surface/programs.
GET /api/v1/surface/programs/{id}/velocity Key or x402 $0.50 per call

Daily intake series.

  • 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 Key or x402 $2.00 per call

Everything for one program in a single 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 Open

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

GET /.well-known/oauth-authorization-server Open

Authorization server metadata (RFC 8414).

POST /agents/oauth/register Open

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

GET /agents/oauth/authorize Open

Authorization endpoint. The member signs in and consents.

POST /agents/oauth/token Open

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

Paying with x402

x402 pay-per-call is not switched on here yet, so Attack Surface calls need a subscription key for now. When it is on, this is how it works.

  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

  1. Every error is JSON with ok: false and an error sentence that says what to change.
  2. 401 means missing or invalid credentials, 402 payment required, 404 not found (not charged), 429 rate limited with Retry-After.
  3. MCP tool failures come back as tool results with isError: true, written for the model to act on.
  4. Scope, payouts and response targets are the platforms' own figures, copied on the date each answer gives. The program's policy page is the authority.

Use of the API is covered by the terms and privacy policy.