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

# Post a strand attachment event.

> EXPERIMENTAL. Record a BYO strand attachment event addressed by discriminator coordinates: declare or retract a payload or field mapping, or suppress/unsuppress one. A declared payload the scan never produced becomes a v2-only payload group; field mappings declared under it attach to that payload.



## OpenAPI

````yaml /api-reference/bundled.yaml post /v0/experimental/component/{id}/discriminator_events
openapi: 3.1.0
info:
  title: Gable API
  description: >
    API to interact with the Gable platform

    ## Authorization

    All API requests require an API key to be passed in the `X-API-KEY` header.
    For instructions on finding your API key and api endpoint check out the [API
    Key documentation](../docs/api-keys.md).

    Example: `curl -H "X-API-KEY: <your-api-key>"
    https://api-{organization}.gable.ai/v0/ping`
  contact:
    name: Gable Engineering
    url: https://gable.ai
    email: engineers@gable.ai
  version: 1.54.0
servers:
  - url: https://{hostname}.gable.ai
    description: Gable API
    variables:
      hostname:
        default: demo-api
        description: Customer environment assigned by Gable
security:
  - ApiKeyAuth: []
tags:
  - name: action
  - name: api-keys
  - name: auth
  - name: changelog
  - name: config
  - name: debug
  - name: settings
  - name: slack
  - name: sso
  - name: webhook
  - name: notifications
  - name: telemetry
  - name: component
  - name: components
  - name: sca
  - name: cross-service-components
  - name: lineage
  - name: events
  - name: measurements
  - name: defect-report
  - name: data-tagging
    description: Tag vocabulary management and field level tagging of lineage boundaries.
paths:
  /v0/experimental/component/{id}/discriminator_events:
    post:
      tags:
        - lineage
      summary: Post a strand attachment event.
      description: >-
        EXPERIMENTAL. Record a BYO strand attachment event addressed by
        discriminator coordinates: declare or retract a payload or field
        mapping, or suppress/unsuppress one. A declared payload the scan never
        produced becomes a v2-only payload group; field mappings declared under
        it attach to that payload.
      operationId: postExperimentalComponentDiscriminatorEvent
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
            format: uuid
          description: UUID of the component the event targets.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DiscriminatorEventRequest'
      responses:
        '201':
          description: Event accepted; receipt returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DiscriminatorEventReceipt'
        '400':
          description: >-
            Bad Request (invalid address, wrong level, bad coordinates, or a
            declared boundary pair on an event other than STRAND_PAYLOAD_ADDED)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Component not found / not authorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Idempotency key reused with a different body.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    DiscriminatorEventRequest:
      type: object
      description: >-
        A single coordinate-addressed attachment event. The `target` is the full
        canonical group address the event attaches to; its level must match the
        event type (payload events target a `payload`, field-mapping events
        target a `field_mapping`). `declaredBoundaryPair` is only valid on
        `STRAND_PAYLOAD_ADDED`.
      properties:
        eventType:
          $ref: '#/components/schemas/StrandEventType'
        target:
          $ref: '#/components/schemas/DiscriminatorGroupAddress'
        declaredBoundaryPair:
          $ref: '#/components/schemas/DiscriminatorDeclaredBoundaryPair'
        note:
          type: string
          description: Optional free-text audit note
        effectiveSinceCommitSha:
          type: string
          pattern: ^[0-9a-f]{40}(?:[0-9a-f]{24})?$
          description: >-
            Full lowercase commit SHA the attachment is effective since; it must
            be a commit the component has a scan for. When omitted, defaults to
            the latest scan's commit. The event applies only to versions whose
            commit is at or after this anchor.
      required:
        - eventType
        - target
      additionalProperties: false
    DiscriminatorEventReceipt:
      type: object
      description: Returned data for a BYO discriminator event.
      properties:
        eventId:
          type: string
          format: uuid
        eventType:
          $ref: '#/components/schemas/StrandEventType'
      required:
        - eventId
        - eventType
      additionalProperties: false
    ErrorResponse:
      type: object
      required:
        - message
      properties:
        id:
          type: number
        title:
          type: string
        message:
          type: string
    StrandEventType:
      type: string
      description: >-
        Public event vocabulary for coordinate-addressed strand attachments.
        ADD/DELETE are BYO group declarations for payloads and field mappings —
        a declared payload absent from the scan becomes a v2-only payload group
        its declared field mappings can attach to; SUPPRESS/UNSUPPRESS toggle a
        suppression for a field mapping or payload.
      enum:
        - STRAND_PAYLOAD_ADDED
        - STRAND_PAYLOAD_DELETED
        - STRAND_FIELD_MAPPING_ADDED
        - STRAND_FIELD_MAPPING_DELETED
        - STRAND_FIELD_MAPPING_SUPPRESSED
        - STRAND_FIELD_MAPPING_UNSUPPRESSED
        - STRAND_PAYLOAD_SUPPRESSED
        - STRAND_PAYLOAD_UNSUPPRESSED
    DiscriminatorGroupAddress:
      type: object
      description: The metadata coordinates for a discriminator group
      properties:
        componentId:
          type: string
          format: uuid
          description: The component this group lives on. Must equal the route component.
        level:
          $ref: '#/components/schemas/DiscriminatorLevel'
        ancestors:
          type: array
          description: >-
            Root-to-immediate-parent ancestor chain. Empty for a `payload`;
            exactly one `payload` entry for a `field_mapping`. Every ancestor
            carries the same component and config identity as this wrapper.
          items:
            $ref: '#/components/schemas/DiscriminatorGroupAncestor'
        coordinates:
          $ref: '#/components/schemas/DiscriminatorGroupCoordinates'
      required:
        - componentId
        - level
        - ancestors
        - coordinates
      additionalProperties: false
    DiscriminatorDeclaredBoundaryPair:
      type: object
      description: >-
        The ingress → egress boundary pair a declared payload runs between,
        named in the same vocabulary as `DiscriminatorBoundary.name`. Valid only
        on `STRAND_PAYLOAD_ADDED`. A payload declared without a scan has no
        roll-up provenance, so this pair is the only source of its boundaries:
        the read reports it as the payload's boundary pair, and every consumer
        of boundary pairs (payload display, graph boundaries, boundary fields,
        edge endpoint display) treats the payload like a scanned one. It is
        never part of the group address, so it never affects coordinates or the
        derived group id, and a scan that later produces the same address
        supersedes it with the roll-up's own pairs.
      properties:
        ingressName:
          type: string
          minLength: 1
          description: The ingress boundary's fully qualified name.
        egressName:
          type: string
          minLength: 1
          description: The egress boundary's fully qualified name.
      required:
        - ingressName
        - egressName
      additionalProperties: false
    DiscriminatorLevel:
      type: string
      description: >-
        A level in the product_canonical group hierarchy. `payload` is the root
        level; `field_mapping` is its child. The group_by dimensions for each
        level are defined by the config, not enumerated by this API (see
        DiscriminatorGroupCoordinates).
      enum:
        - payload
        - field_mapping
    DiscriminatorGroupAncestor:
      type: object
      description: >-
        One ancestor group in a canonical address chain. Ancestors are ordered
        root-to-immediate-parent: a `field_mapping` carries its `payload`, and a
        `payload` carries none. The chain's depth and each level's coordinate
        dimensions are the discriminator config's, not this API's — copy an
        ancestor's coordinates verbatim rather than rebuilding them. The service
        derives the parent chain from these coordinates; clients never supply an
        authoritative parent group ID.
      properties:
        level:
          $ref: '#/components/schemas/DiscriminatorLevel'
        coordinates:
          $ref: '#/components/schemas/DiscriminatorGroupCoordinates'
      required:
        - level
        - coordinates
      additionalProperties: false
    DiscriminatorGroupCoordinates:
      type: object
      description: >-
        Discriminator-group coordinates — the durable address of a group, as
        key-value pairs of the facts the group is grouped by. Keys are the
        discriminator config's group_by dimensions for the group's level,
        verbatim; the dimension vocabulary is defined by the config, not by this
        API. Values are the exact grouping facts; null is the engine's null
        coordinate (fact unknown). Edges and BYO metadata attach to lineage by
        these coordinates, never by group ID (group IDs are derived from
        coordinates by the discriminator engine and are only stable within one
        discriminator config).
      additionalProperties:
        description: >-
          A grouping fact. The engine's coordinate value algebra: null, boolean,
          integer, string, or array of strings.
        anyOf:
          - type: 'null'
          - type: boolean
          - type: integer
          - type: string
          - type: array
            items:
              type: string
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY

````

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