Skip to main content
Plans: Every plan and the free trial. A read-only workspace answers 402. Who: an agent connected over OAuth with the incidents:draft scope, acting for a member of a workspace that allows agents.
These endpoints are what the MCP server’s register and draft tools call. They open incidents to be assessed and hold proposed report text for a person to review. Nothing here starts a clock, changes a pack or files anything. There is no endpoint for that, on any token.
{report} is early_warning, notification or final_report.

Authentication

Send an OAuth access token from an MCP client’s sign-in:
An API token gets 401 on these endpoints, whatever its scopes. Everything an agent writes shows in the audit trail as the agent, on behalf of the person who connected it.

Register a vulnerability

POST /api/v1/incidents opens one incident per product family, being assessed. No clock starts: a person says whether it’s exploited in the product. See work with an agent. Pharus titles each incident from the id and the family. Versions come from the family’s SBOMs, else its current version, and member states from the family. A person can correct them. A field it doesn’t know is refused with 400, so nothing can set the awareness time, the source, the title or the versions. A family that already has an incident for this id, open or closed and whoever opened it, gets that incident back. So a retry is safe, and the answer says what happened. If one family is wrong, nothing opens.
matchVex is the VEX status on the family’s match, if there is one: read not_affected before going on. The response is 201 when any incident opened and 200 when none did. POST /api/v1/incidents/{reference}/families opens an incident for another family, with the same id and the agent’s summary. Body: familyId (required). The response is { incident }, with the same fields as above: 201 opened, 200 it was already there. 409 with no_vulnerability when the incident isn’t about a vulnerability with an id. An incident’s own family can’t change.

Read a report’s pack

GET /api/v1/incidents/{reference}/reports/{report} returns the SRP pack as it stands. It holds draft text, so it needs incidents:draft: a read token never sees it.

Propose report text

POST /api/v1/incidents/{reference}/reports/{report}/draft holds text for a person to review. It doesn’t touch the pack. A person accepts it, changes it or dismisses it on the incident’s SRP pack tab. See review a draft. Write in English, as the SRP takes English only. Write a fact you don’t have as [[what is missing]]: Pharus counts that field as missing until someone fills it in. The response is 201 with the proposal and its url. warnings lists what to check, such as gap:3:affected versions, or ungrounded:v21:CVE-2026-9999 for an id or link that isn’t in the incident’s record. A new proposal replaces one not yet reviewed. The same text again changes nothing.

Check a token

GET /api/v1/token says whether a token still works and what it was given: { scopes, workspace, onBehalfOf, agent }. It doesn’t count against your reads.

Errors

Errors have the same shape as everywhere in the API: { "error": "...", "message": "..." }.

MCP server

Work with an agent

Read workspace data

SRP paste pack