Repositories
Connect GitHub repositories, manage per-repository PR-review policy, and revoke access.
A connected repository is what makes whitebox pentesting and automated PR review possible. Connecting one is a GitHub App installation, so it needs a browser once; everything after that is scriptable.
The repository object
Prop
Type
Policy fields versus effective fields
Each policy is three-valued. default defers to the
organization default; on and off override it for
this repository alone. The effective_* booleans are that resolution already done for you.
To know what will actually happen on the next PR, read effective_*. To know whether this
repository overrides the organization, read the policy field. Reading a policy field to predict
behavior is the mistake to avoid — default tells you nothing on its own.
Prop
Type
Connect a repository
The GitHub App has to be installed by a human. Three calls, one of them in a browser:
Get an install URL
POST /repositories/connect/start · scope repositories:write · role admin
No body.
{ "install_url": "https://github.com/apps/vulnix/installations/new?state=…" }The user installs the app
Send them to install_url. GitHub returns them with an installation_id and the state you
issued.
Claim the installation
POST /repositories/connect · scope repositories:write · role admin · returns 201
{ "installation_id": "48210991", "state": "…" }{ "installation_id": "48210991" }A state that does not match returns 422 invalid_github_connect_state. An installation
already claimed by another organization returns 409 github_installation_already_claimed.
List installations
GET /repositories/installations · scope repositories:read · role admin
{
"installations": [
{
"installation_id": "48210991",
"account_login": "acme-inc",
"connected_at": "2026-09-16T17:11:02.884120+00:00"
}
]
}See what is available to add
GET /repositories/available · scope repositories:read · role admin
{ "has_installation": true, "repositories": [] }Everything the installation can see but that you have not added yet. has_installation: false
means no GitHub App is installed — start at connect rather than
treating the empty list as "no repositories".
Add repositories
POST /repositories · scope repositories:write · role admin · returns 201
Prop
Type
Returns { "repositories": [...] } with the full objects for everything now connected. An
installation that is no longer valid returns 422 github_installation_invalid.
List and read
GET /repositories · scope repositories:read · role admin
{ "repositories": [] }GET /repositories/{repository_id} returns one repository object.
Update policy
PATCH /repositories/{repository_id} · scope repositories:write · role admin
Sparse — omitted fields are unchanged.
Prop
Type
curl -X PATCH https://api.vulnix.dev/repositories/$REPO_ID \
-H "Authorization: Bearer $VULNIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"block_on_findings_policy": "on", "approve_clean_prs_policy": "default"}'Returns the updated repository object with effective_* recomputed. Any value outside the
three allowed returns 422 invalid_request.
Revoke a repository
POST /repositories/{repository_id}/revoke · scope repositories:write · role admin
Stops all review activity and drops stored access. Returns the repository object with status
of revoked. Revoking one already revoked returns 409 repository_already_revoked.
Findings and PR reviews produced while it was connected are kept — revoking ends future access, it does not erase history.
Disconnect an installation
POST /repositories/installations/{installation_id}/disconnect · scope repositories:write · role admin
{ "ok": true }Removes the whole installation and with it every repository under it. Use revoke to drop a single repository instead.