> ## 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.

# Create a virtual tag rule

> Adds a rule at the bottom of its tag key so it cannot outrank an existing rule. The predicate, and the value expression of an inherited rule, are compiled before the rule is stored. A rule is written one of three ways and exactly one may be sent: expression as CostQL text, clause as a single chip, or node as a tree of chips. A node is rendered server-side by the same renderer the decompose endpoint round-trips through, so a rule saved from chips reads back as the identical tree, and sending node together with expression or clause is a 400 rather than a silent pick. Every leaf of a node is checked like a flat clause, so a tree cannot smuggle in a field or operator the clause path would refuse.



## OpenAPI

````yaml /api-reference/costgraph/openapi.json post /api/v1/tenant/virtual-tags
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-tags:
    post:
      tags:
        - virtual-tags
      summary: Create a virtual tag rule
      description: >-
        Adds a rule at the bottom of its tag key so it cannot outrank an
        existing rule. The predicate, and the value expression of an inherited
        rule, are compiled before the rule is stored. A rule is written one of
        three ways and exactly one may be sent: expression as CostQL text,
        clause as a single chip, or node as a tree of chips. A node is rendered
        server-side by the same renderer the decompose endpoint round-trips
        through, so a rule saved from chips reads back as the identical tree,
        and sending node together with expression or clause is a 400 rather than
        a silent pick. Every leaf of a node is checked like a flat clause, so a
        tree cannot smuggle in a field or operator the clause path would refuse.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/virtualtag.RuleRequest'
        description: Rule to create
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/responses.SuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/virtualtag.Rule'
        '400':
          description: Bad Request
          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.RuleRequest:
      type: object
      properties:
        clause:
          $ref: '#/components/schemas/virtualtag.Clause'
        description:
          type: string
        expression:
          type: string
        inherited_from:
          type: string
        key:
          type: string
        node:
          $ref: '#/components/schemas/virtualtag.Node'
        origin:
          type: string
        rule_type:
          type: string
        scope:
          type: string
        source_text:
          type: string
        valid_from:
          type: string
        valid_to:
          type: string
        value:
          type: string
    responses.SuccessResponse:
      type: object
      required:
        - message
        - status
      properties:
        data: {}
        message:
          type: string
          example: some message
        status:
          type: string
          example: success
    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
    responses.ErrorResponse:
      type: object
      required:
        - message
        - status
      properties:
        message:
          type: string
          example: some message
        status:
          type: string
          example: error
    virtualtag.Clause:
      type: object
      properties:
        field:
          type: string
        match_value:
          type: string
        operator:
          type: string
    virtualtag.Node:
      type: object
      properties:
        children:
          type: array
          items:
            $ref: '#/components/schemas/virtualtag.Node'
        clause:
          $ref: '#/components/schemas/virtualtag.Clause'
        kind:
          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.