> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scanoss.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulk-resolve open OSS findings across every project

> Organization-wide sibling of bulk-resolve: resolves all open findings matching the given domain_slug and optional purl/path_prefix scope across every project in the organization, in a single transaction. All bulk-resolve semantics apply unchanged (all-or-nothing, idempotent skip of already-resolved findings, suppressed findings withheld, reason-required rule). This is the confirm step of the Scan Configuration save offer: an explicit, user-confirmed action — never triggered implicitly by saving configuration.



## OpenAPI

````yaml /api-reference/earnie/triage-openapi.json post /v1/findings/actions/bulk-resolve-org-wide
openapi: 3.0.3
info:
  title: Earnie Findings API
  description: List and read findings, triage them, and review resolutions.
  version: 1.0.0
servers:
  - url: https://{tenant}.earnie.dev
    description: Your Earnie deployment
    variables:
      tenant:
        default: your-company
        description: >-
          Your organization's Earnie address, as shown in your browser when you
          sign in.
security:
  - bearerAuth: []
paths:
  /v1/findings/actions/bulk-resolve-org-wide:
    post:
      tags:
        - findings
      summary: Bulk-resolve open OSS findings across every project
      description: >-
        Organization-wide sibling of bulk-resolve: resolves all open findings
        matching the given domain_slug and optional purl/path_prefix scope
        across every project in the organization, in a single transaction. All
        bulk-resolve semantics apply unchanged (all-or-nothing, idempotent skip
        of already-resolved findings, suppressed findings withheld,
        reason-required rule). This is the confirm step of the Scan
        Configuration save offer: an explicit, user-confirmed action — never
        triggered implicitly by saving configuration.
      operationId: PostV1FindingsActionsBulkResolveOrgWide
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrgWideBulkResolveRequest'
      responses:
        '200':
          description: Bulk resolution result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkResolveResponse'
        '400':
          description: >-
            Validation error (unknown_reason / reason_required / invalid
            request)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Not authenticated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Insufficient permissions (findings:write required)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    OrgWideBulkResolveRequest:
      type: object
      description: >-
        Organization-wide variant of BulkResolveRequest: the same selection and
        resolution semantics, applied across every project in the organization.
        Used by the Scan Configuration save offer — the explicit, user-confirmed
        bulk-resolve of currently open findings matching a saved org-layer
        Component override. Deliberately a separate endpoint from bulk-resolve
        so an org-wide sweep can never happen by merely omitting a project_id.
      required:
        - domain_slug
        - reason
        - scope
      properties:
        domain_slug:
          type: string
          description: Producer domain_slug to filter findings (e.g. "oss").
        path_prefix:
          type: string
          nullable: true
          description: Optional folder path prefix scope filter.
        purl:
          type: string
          nullable: true
          description: Optional component PURL scope filter.
        reason:
          $ref: '#/components/schemas/Reason'
        scope:
          $ref: '#/components/schemas/Scope'
        justification:
          type: string
          nullable: true
          description: Optional human-readable justification for the bulk resolution.
        replacement_purl:
          type: string
          nullable: true
          description: Versioned PURL required when reason.slug is replace_component.
        concluded_license:
          type: string
          nullable: true
          description: >-
            Optional license the operator concluded for the component (an SPDX
            identifier when picked from the SPDX list). Stored on every created
            resolution as structured evidence.
    BulkResolveResponse:
      type: object
      description: >-
        Result of a bulk-resolve operation. affected is the count of findings
        newly resolved in this call. unchanged counts findings that were already
        non-open and skipped idempotently. skipped counts findings excluded by
        scope or other non-error conditions. failed counts findings that caused
        an error (currently at most 1 — the operation aborts on first failure).
      required:
        - affected
        - unchanged
        - skipped
        - failed
      properties:
        affected:
          type: integer
          description: Number of findings newly resolved in this call.
        unchanged:
          type: integer
          description: >-
            Number of findings already resolved or in non-open state (idempotent
            skip).
        skipped:
          type: integer
          description: >-
            Number of findings excluded by scope filter or other non-error
            conditions.
        failed:
          type: integer
          description: Number of findings that caused an error (triggers full rollback).
        finding_ids:
          type: array
          items:
            type: string
            format: uuid
          description: >-
            IDs of the findings that were resolved in this call. Callers can use
            this list to update local state without a full re-fetch.
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
        message:
          type: string
    Reason:
      type: object
      description: >-
        A triage resolution reason. The canonical slugs cover five families: OSS
        (confirm_match, mark_original, replace_component), declared dependencies
        (accept_dependency, dismiss_dependency), crypto (confirm_usage,
        false_positive, accepted_risk), AI usage (confirm_ai_usage,
        not_ai_usage, approve_ai_usage), and identified AI models
        (approve_model, reject_model, wrong_identification). Each slug decides
        findings of its own family only; any other finding answers 400
        reason_domain_mismatch. Callers MUST supply a non-empty slug by default;
        the org-level triage_reason_required setting controls whether an empty
        slug is permitted (see CAP2). Each slug carries a gate posture, reported
        by the suppresses field below and applied by the resolve path: resolving
        with a suppressing reason drops the finding from PR-gate impact, and
        reopening it undoes that suppression.
      required:
        - domain_slug
        - slug
        - display_name
      properties:
        domain_slug:
          type: string
          description: >-
            Owning domain for this reason. For canonical reasons the value is
            "triage"; legacy rows produced before the canonical registry was
            introduced may carry the producer domain slug.
        slug:
          type: string
          description: >-
            Machine-readable reason identifier. Stable wire values:
            confirm_match, mark_original, replace_component (OSS),
            accept_dependency, dismiss_dependency (declared dependencies),
            confirm_usage, false_positive, accepted_risk (crypto),
            confirm_ai_usage, not_ai_usage, approve_ai_usage (AI usage), and
            approve_model, reject_model, wrong_identification (AI models). Do
            NOT use confirm or original — those are NOT valid slugs.
        display_name:
          type: string
          description: Human-readable label for UI rendering.
        suppresses:
          type: boolean
          description: >-
            The reason's gate posture. true for mark_original,
            dismiss_dependency, false_positive, accepted_risk, not_ai_usage,
            approve_ai_usage, approve_model and wrong_identification: resolving
            with one of these removes the finding from PR-gate impact for as
            long as it stays resolved. false for confirm_match, confirm_usage,
            confirm_ai_usage, reject_model, accept_dependency and
            replace_component: the finding keeps gate impact — a non-suppressing
            reason adds no suppression, and equally never lifts one applied
            through the suppress endpoint. Reopening a finding undoes the
            suppression its resolution applied, but never one applied through
            the suppress endpoint. null means the reason carries no declared
            posture (a slug outside the canonical registry) — do NOT read an
            absent or null value as suppresses=false.
          nullable: true
    Scope:
      type: object
      required:
        - kind
        - value
      properties:
        kind:
          type: string
          enum:
            - path
            - purl
            - rule_param
        value:
          type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        An Earnie API key, sent as `Authorization: Bearer sk_earnie_...`. Create
        one under Settings > API keys. The key's scopes decide which operations
        it may call.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.