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

# Apply a group of virtual tag suggestions

> Turns every pending suggestion in the group into a live rule under its key, creating keys as needed. Pass suggestion_ids to apply a subset; omit it for every pending member. Rules append after any that already exist, ranked by the given id order, otherwise by key and the order the agent proposed them. The batch is all or nothing: if any member cannot be compiled into a rule, nothing is written and the per-suggestion errors come back as a 400. Unlike the single-suggestion endpoint, a member that is already answered is reported as skipped rather than a 409, so a retry that finds the work done succeeds. A member matching an existing rule is skipped as a duplicate and marked applied against that rule.



## OpenAPI

````yaml /api-reference/costgraph/openapi.json post /api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply
openapi: 3.0.0
info:
  description: Read and manage your CostGraph organization, spend, alerts, and settings.
  title: CostGraph API
  contact: {}
  version: '1.0'
servers:
  - url: https://api.costgraph.ai
security: []
tags:
  - name: ai
    x-group: AI
  - name: ai-serving
    x-group: AI serving
  - name: anomalies
    x-group: Anomalies
  - name: auth
    x-group: Auth
  - name: billing
    x-group: Billing
  - name: billing-export
    x-group: Billing export
  - name: budgets
    x-group: Budgets
  - name: ci
    x-group: CI
  - name: compute-recommendations
    x-group: Compute recommendations
  - name: config
    x-group: Config
  - name: cost
    x-group: Cost
  - name: gpus
    x-group: GPUs
  - name: graphai
    x-group: Graph AI
  - name: infracost
    x-group: Infracost
  - name: integrations
    x-group: Integrations
  - name: invitations
    x-group: Invitations
  - name: kubernetes-clusters
    x-group: Kubernetes clusters
  - name: marketplace
    x-group: Marketplace
  - name: network-requests
    x-group: Network requests
  - name: notifications
    x-group: Notifications
  - name: oauth
    x-group: OAuth
  - name: oauth-clients
    x-group: OAuth clients
  - name: opencost
    x-group: OpenCost
  - name: organization
    x-group: Audit log
  - name: organizations
    x-group: Organizations
  - name: placement-alternatives
    x-group: Placement alternatives
  - name: reports
    x-group: Reports
  - name: service-map
    x-group: Service map
  - name: settings
    x-group: Settings
  - name: sso
    x-group: Single sign-on
  - name: tenants
    x-group: Tenants
  - name: user
    x-group: Users
  - name: virtual-machines
    x-group: Virtual machines
  - name: virtual-tags
    x-group: Virtual tags
  - name: workflows
    x-group: Workflows
paths:
  /api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply:
    post:
      tags:
        - virtual-tags
      summary: Apply a group of virtual tag suggestions
      description: >-
        Turns every pending suggestion in the group into a live rule under its
        key, creating keys as needed. Pass suggestion_ids to apply a subset;
        omit it for every pending member. Rules append after any that already
        exist, ranked by the given id order, otherwise by key and the order the
        agent proposed them. The batch is all or nothing: if any member cannot
        be compiled into a rule, nothing is written and the per-suggestion
        errors come back as a 400. Unlike the single-suggestion endpoint, a
        member that is already answered is reported as skipped rather than a
        409, so a retry that finds the work done succeeds. A member matching an
        existing rule is skipped as a duplicate and marked applied against that
        rule.
      parameters:
        - description: Tenant ID
          name: X-CostGraph-Tenant-ID
          in: header
          required: true
          schema:
            type: string
        - description: Suggestion group ID
          name: group_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/virtualtag.SuggestionGroupActionRequest'
        description: Members to apply
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/responses.SuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/virtualtag.SuggestionGroupResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
      security:
        - BearerAuth: []
components:
  schemas:
    virtualtag.SuggestionGroupActionRequest:
      type: object
      properties:
        suggestion_ids:
          type: array
          items:
            type: string
    responses.SuccessResponse:
      type: object
      required:
        - message
        - status
      properties:
        data: {}
        message:
          type: string
          example: some message
        status:
          type: string
          example: success
    virtualtag.SuggestionGroupResult:
      type: object
      properties:
        answered:
          type: array
          items:
            type: string
        group_id:
          type: string
        progress:
          $ref: '#/components/schemas/db.VirtualTagSuggestionProgress'
        resolved:
          type: boolean
        rules:
          type: array
          items:
            $ref: '#/components/schemas/virtualtag.Rule'
        skipped:
          type: array
          items:
            $ref: '#/components/schemas/virtualtag.SkippedSuggestion'
    responses.ErrorResponse:
      type: object
      required:
        - message
        - status
      properties:
        message:
          type: string
          example: some message
        status:
          type: string
          example: error
    db.VirtualTagSuggestionProgress:
      type: object
      properties:
        applied:
          type: integer
        ignored:
          type: integer
        pending:
          type: integer
        total:
          type: integer
    virtualtag.Rule:
      type: object
      properties:
        active:
          type: boolean
        created_at:
          type: string
        description:
          type: string
        expression:
          type: string
        expression_hash:
          type: string
        field:
          type: string
        id:
          type: string
        inherited_from:
          type: string
        key:
          type: string
        match_value:
          type: string
        operator:
          type: string
        origin:
          type: string
        rank:
          type: number
        rule_type:
          type: string
        scope:
          type: string
        source_text:
          type: string
        tenant_id:
          type: string
        updated_at:
          type: string
        valid_from:
          type: string
        valid_to:
          type: string
        value:
          type: string
    virtualtag.SkippedSuggestion:
      type: object
      properties:
        reason:
          type: string
        rule_id:
          type: string
        suggestion_id:
          type: string
  securitySchemes:
    BearerAuth:
      description: Enter "Bearer {token}"
      type: apiKey
      name: Authorization
      in: header

````

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