Picus Security · Authentication Profile

Picus Security Authentication

Authentication

Picus Security secures its APIs with apiKey across 1 declared security scheme, as derived from its OpenAPI definitions.

cybersecuritysecurity-validationbreach-and-attack-simulationadversarial-exposure-validationcontinuous-threat-exposure-managementpenetration-testingthreat-intelligencemitre-attackdetection-engineeringsecurity-operations
Methods: apiKey Schemes: 1 OAuth flows: API key in: header

Security Schemes

Access-Token apiKey
· in: header (Authorization)

Source

Authentication Profile

Raw ↑
generated: '2026-08-02'
method: searched
docs: https://apidocs.picussecurity.com/docs/authentication-method
source: >-
  https://apidocs.picussecurity.com/docs/authentication-method (upgraded a derived pass over the 14
  openapi/ spec files split from openapi/_original/picus-security-openapi.json)
summary:
  types:
  - apiKey
  api_key_in:
  - header
  model: refresh-token-exchange
  note: >-
    Picus describes the model as OAuth2 ("OAuth2 protocol is used to authorize Refresh/Access tokens") but
    the contract declares a single apiKey scheme and the exchange is a proprietary JSON POST, not an
    RFC 6749 token endpoint. See conformance/picus-security-conformance.yml.
flow:
  step_1:
    action: Generate a refresh token (human, in the console)
    where: app.picussecurity.com > Settings > Rest API Token > Generate Token
    inputs: [token name (unique), description, expiration in days, scope]
    ttl: 6 months
    note: >-
      The token and its curl command are displayed exactly once and cannot be retrieved afterwards. The
      console lists existing tokens with name, creation date, created by, expiration date, scopes and
      active/expired status.
  step_2:
    action: Exchange the refresh token for an access token
    operationId: AuthTokenParam
    request: POST https://api.picussecurity.com/v1/auth/token
    request_headers:
      Content-Type: application/json
    request_body: '{"refresh_token": "<refresh token>"}'
    response_body: '{"token": "<access token>", "expire_at": <unix epoch MILLISECONDS>}'
    ttl: 2 hours
    unauthenticated: true
  step_3:
    action: Call any endpoint with the access token
    header: 'Authorization: Bearer <accessToken>'
    note: All Picus API endpoints except the token endpoint use this single credential.
  rotation:
    action: Regenerate the refresh token
    operationId: RegenerateRefreshTokenParam
    request: POST https://api.picussecurity.com/v1/auth/refresh
    effect: >-
      Issues a new refresh token and INVALIDATES the previous refresh and access tokens. Cannot be used once
      the refresh token has already expired — a new one must then be generated from the console.
scopes:
  supported: true
  published: false
  note: >-
    Refresh tokens are created with a SCOPE that "is used to filter the API endpoints accessible by the
    token", and the console shows a scopes column per token. Picus does not publish the scope vocabulary in
    the docs or declare it in the contract, so no scopes/ artifact can be captured. A 403 on an endpoint the
    user's role permits usually means the token's scope is too narrow.
authorization:
  model: role-based
  roles_endpoint: GET /v1/users/roles (RolesFilterParams)
  assign_endpoint: PUT /v1/users/{userId}/role (assignRoleParams)
  note: >-
    Effective permission is the intersection of the user's assigned role and the refresh token's scope.
schemes:
- name: Access-Token
  type: apiKey
  in: header
  parameter: Authorization
  value_form: 'Bearer {accessToken}'
  applied: global
  applied_note: Declared as a global `security` requirement on the root document and repeated per operation.
  description: >-
    After getting the access token, type "Bearer accessToken" in the Authorization header value to request
    access to the endpoints.
  sources:
  - openapi/picus-security-activity-logs-openapi.yml
  - openapi/picus-security-agents-openapi.yml
  - openapi/picus-security-authentication-openapi.yml
  - openapi/picus-security-instances-openapi.yml
  - openapi/picus-security-integrations-openapi.yml
  - openapi/picus-security-mitigation-openapi.yml
  - openapi/picus-security-simulation-latest-result-openapi.yml
  - openapi/picus-security-simulation-result-openapi.yml
  - openapi/picus-security-simulation-result-reports-openapi.yml
  - openapi/picus-security-simulations-openapi.yml
  - openapi/picus-security-summary-openapi.yml
  - openapi/picus-security-templates-openapi.yml
  - openapi/picus-security-threats-openapi.yml
  - openapi/picus-security-users-openapi.yml
gaps:
- No OIDC discovery document and no RFC 8414 authorization-server metadata (all /.well-known/ paths 404).
- No mTLS, no client credentials, no PKCE — the refresh token is a bearer secret with a 6 month lifetime.
- The scope vocabulary is enforced but unpublished, so token least-privilege cannot be planned from the docs.
- The expire_at field is milliseconds while the rate-limit reset header is seconds — an easy client bug.
evidence:
- url: https://apidocs.picussecurity.com/docs/authentication-method
  http_status: 200
  fetched: '2026-08-02'
- source: openapi/_original/picus-security-openapi.json
  kind: securityDefinitions