Vulnix
API

Organization

Read and update the organization profile, logo, and default PR-review policy.

The organization is the tenant everything else belongs to. A token always acts inside exactly one — the one its creator was in when the token was made. There is no way to switch organizations with a token.

Update the profile

PATCH /org · scope organization:write · role admin

Sparse — omitted fields are left unchanged.

Prop

Type

curl -X PATCH https://api.vulnix.dev/org \
  -H "Authorization: Bearer $VULNIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme Inc", "website": "https://acme.example.com"}'
{
  "org_id": "01K5ADMINORG000000000000A",
  "org_name": "Acme Inc",
  "website": "https://acme.example.com",
  "industry": null,
  "team_size": null
}

The organization is always taken from the token — there is no org_id in the body, and a caller can only ever update their own.

GET /org/logo · scope organization:read · no minimum role

Returns the image bytes with the stored content type, not JSON. 404 avatar_not_found when no logo has been uploaded.

POST /org/logo · scope organization:write · role admin

multipart/form-data with a single file field.

curl -X POST https://api.vulnix.dev/org/logo \
  -H "Authorization: Bearer $VULNIX_TOKEN" \
  -F "file=@logo.png"
{ "logo_url": "/api/org-logo/01K5ADM…?v=01M2NP…" }

Prop

Type

An empty file, an unsupported type, or a mismatched signature all return 422 invalid_avatar_upload.

The returned logo_url carries a fresh cache-busting suffix on every upload, so store the new value rather than reusing the old URL.

PR review defaults

PATCH /org/pr-review-defaults · scope organization:write · role admin

Organization-wide defaults that every repository inherits unless it overrides them. Sparse.

Prop

Type

{
  "default_approve_clean_prs": "on",
  "default_block_on_findings": "on",
  "default_rereview_on_push": "off"
}

Only `on` and `off` here

These are the defaults themselves, so they must resolve to a real value — per-repository policy is the three-valued field, where default means "inherit whatever is set here". Sending default to this endpoint returns 422 invalid_request.

Changing a default immediately changes the behavior of every repository whose own policy is default. Read each repository's effective_* fields afterwards to confirm what will actually happen.

Complete onboarding

POST /org/onboarding-complete · scope organization:write · no minimum role

No body. Marks the onboarding flow finished.

{
  "org_id": "01K5ADMINORG000000000000A",
  "onboarding_completed_at": "2026-09-16T17:02:44.118293+00:00"
}

Console-only organization endpoints

Two organization operations exist that no token can call, whatever scopes it carries. Both return 403 api_token_route_not_allowed:

Prop

Type

Both mint and return a console session token as part of their response — creating a workspace signs you into it, deleting one signs you into whatever workspace you land on next. An endpoint that hands out a session is an endpoint that would let a narrowly-scoped token trade itself up for an unscoped one, so neither is reachable with an API token by design. The same rule keeps /auth/switch-org and every other session-issuing route console-only.

Use the console for both. See what tokens cannot do.

On this page