GrowthBook visual-changesets API

Groups of visual changes made by the visual editor to a single page

OpenAPI Specification

growthbook-visual-changesets-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  version: 1.0.0
  title: GrowthBook REST AnalyticsExplorations visual-changesets API
  description: "GrowthBook offers a full REST API for interacting with the application.\n\nRequest data can use either JSON or Form data encoding (with proper `Content-Type` headers). All response bodies are JSON-encoded.\n\nThe API base URL for GrowthBook Cloud is `https://api.growthbook.io/api`. For self-hosted deployments, it is the same as your API_HOST environment variable (defaults to `http://localhost:3100/api`). The rest of these docs will assume you are using GrowthBook Cloud.\n\n## Versioning\n\nEndpoints are versioned by path prefix:\n\n- `/v1/...` — stable, widely-supported endpoints\n- `/v2/...` — updated endpoints with improved shapes (e.g. unified per-rule environment scope for feature flags)\n\nNew integrations should prefer v2 where available.\n\n## Authentication\n\nWe support both the HTTP Basic and Bearer authentication schemes for convenience.\n\nYou first need to generate a new API Key in GrowthBook. Different keys have different permissions:\n\n- **Personal Access Tokens**: These are sensitive and provide the same level of access as the user has to an organization. These can be created by going to `Personal Access Tokens` under the your user menu.\n- **Secret Keys**: These are sensitive and provide the level of access for the role, which currently is either `admin` or `readonly`. Only Admins with the `manageApiKeys` permission can manage Secret Keys on behalf of an organization. These can be created by going to `Settings -> API Keys`\n\nIf using HTTP Basic auth, pass the Secret Key as the username and leave the password blank (when using curl, add `:` at the end of the secret to indicate an empty password)\n\n```bash\ncurl https://api.growthbook.io/api/v1/features \\\n  -u secret_abc123DEF456:\n```\n\nIf using Bearer auth, pass the Secret Key as the token:\n\n```bash\ncurl https://api.growthbook.io/api/v1/features \\\n-H \"Authorization: Bearer secret_abc123DEF456\"\n```\n\n## Errors\n\nThe API may return the following error status codes:\n\n- **400** - Bad Request - Often due to a missing required parameter\n- **401** - Unauthorized - No valid API key provided\n- **402** - Request Failed - The parameters are valid, but the request failed\n- **403** - Forbidden - Provided API key does not have the required access\n- **404** - Not Found - Unknown API route or requested resource\n- **429** - Too Many Requests - You exceeded the rate limit of 60 requests per minute. Try again later.\n- **5XX** - Server Error - Something went wrong on GrowthBook's end (these are rare)\n\nThe response body will be a JSON object with the following properties:\n\n- **message** - Information about the error\n"
servers:
- url: https://api.growthbook.io/api
  description: GrowthBook Cloud
- url: https://{domain}/api
  description: Self-hosted GrowthBook
security:
- bearerAuth: []
- basicAuth: []
tags:
- name: visual-changesets
  x-displayName: Visual Changesets
  description: Groups of visual changes made by the visual editor to a single page
paths:
  /v1/experiments/{id}/visual-changesets:
    get:
      operationId: listVisualChangesets
      summary: Get all visual changesets
      tags:
      - visual-changesets
      parameters:
      - name: id
        in: path
        required: true
        description: The experiment id the visual changesets belong to
        schema:
          description: The experiment id the visual changesets belong to
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  visualChangesets:
                    type: array
                    items:
                      $ref: '#/components/schemas/VisualChangeset'
                required:
                - visualChangesets
                additionalProperties: false
      x-codeSamples:
      - lang: cURL
        source: "curl -X GET 'https://api.growthbook.io/api/v1/experiments/abc123/visual-changesets' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'"
    post:
      operationId: postVisualChangesets
      summary: Create a visual changeset for an experiment
      tags:
      - visual-changesets
      parameters:
      - $ref: '#/components/parameters/id'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                editorUrl:
                  description: URL of the page opened in the visual editor when creating this changeset
                  type: string
                urlPatterns:
                  description: URL patterns that determine which pages this visual changeset applies to
                  type: array
                  items:
                    type: object
                    properties:
                      include:
                        type: boolean
                      type:
                        type: string
                        enum:
                        - simple
                        - regex
                      pattern:
                        type: string
                    required:
                    - type
                    - pattern
                    additionalProperties: false
              required:
              - editorUrl
              - urlPatterns
              additionalProperties: false
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  visualChangeset:
                    $ref: '#/components/schemas/VisualChangeset'
                required:
                - visualChangeset
                additionalProperties: false
      x-codeSamples:
      - lang: cURL
        source: "curl -X POST 'https://api.growthbook.io/api/v1/experiments/abc123/visual-changesets' \\\n  -H 'Authorization: Bearer YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"editorUrl\":\"https://example.com/\",\"urlPatterns\":[{\"type\":\"simple\",\"pattern\":\"/\",\"include\":true}]}'"
  /v1/visual-changesets/{id}:
    get:
      operationId: getVisualChangeset
      summary: Get a single visual changeset
      tags:
      - visual-changesets
      parameters:
      - $ref: '#/components/parameters/id'
      - $ref: '#/components/parameters/includeExperiment'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  visualChangeset:
                    $ref: '#/components/schemas/VisualChangeset'
                  experiment:
                    $ref: '#/components/schemas/Experiment'
                required:
                - visualChangeset
                additionalProperties: false
      x-codeSamples:
      - lang: cURL
        source: "curl -X GET 'https://api.growthbook.io/api/v1/visual-changesets/abc123' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'"
    put:
      operationId: putVisualChangeset
      summary: Update a visual changeset
      tags:
      - visual-changesets
      parameters:
      - $ref: '#/components/parameters/id'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  nModified:
                    type: number
                  visualChangeset:
                    $ref: '#/components/schemas/VisualChangeset'
                required:
                - nModified
                - visualChangeset
                additionalProperties: false
      x-codeSamples:
      - lang: cURL
        source: "curl -X PUT 'https://api.growthbook.io/api/v1/visual-changesets/abc123' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'"
  /v1/visual-changesets/{id}/visual-change:
    post:
      operationId: postVisualChange
      summary: Create a visual change for a visual changeset
      tags:
      - visual-changesets
      parameters:
      - $ref: '#/components/parameters/id'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  nModified:
                    type: number
                required:
                - nModified
                additionalProperties: false
      x-codeSamples:
      - lang: cURL
        source: "curl -X POST 'https://api.growthbook.io/api/v1/visual-changesets/{id}/visual-change' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'"
  /v1/visual-changesets/{id}/visual-change/{visualChangeId}:
    put:
      operationId: putVisualChange
      summary: Update a visual change for a visual changeset
      tags:
      - visual-changesets
      parameters:
      - $ref: '#/components/parameters/id'
      - $ref: '#/components/parameters/visualChangeId'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  nModified:
                    type: number
                required:
                - nModified
                additionalProperties: false
      x-codeSamples:
      - lang: cURL
        source: "curl -X PUT 'https://api.growthbook.io/api/v1/visual-changesets/{id}/visual-change/{visualChangeId}' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'"
components:
  parameters:
    visualChangeId:
      name: visualChangeId
      in: path
      required: true
      description: Specify a specific visual change
      schema:
        description: Specify a specific visual change
        type: string
    includeExperiment:
      name: includeExperiment
      in: query
      description: Include the associated experiment in payload
      schema:
        description: Include the associated experiment in payload
        type: integer
    id:
      name: id
      in: path
      required: true
      description: The id of the requested resource
      schema:
        description: The id of the requested resource
        type: string
  schemas:
    VisualChangeset:
      type: object
      properties:
        id:
          type: string
        urlPatterns:
          type: array
          items:
            type: object
            properties:
              include:
                type: boolean
              type:
                type: string
                enum:
                - simple
                - regex
              pattern:
                type: string
            required:
            - type
            - pattern
            additionalProperties: false
        editorUrl:
          type: string
        experiment:
          type: string
        visualChanges:
          type: array
          items:
            type: object
            properties:
              description:
                type: string
              css:
                type: string
              js:
                type: string
              variation:
                type: string
              domMutations:
                type: array
                items:
                  type: object
                  properties:
                    selector:
                      type: string
                    action:
                      type: string
                      enum:
                      - append
                      - set
                      - remove
                    attribute:
                      type: string
                    value:
                      type: string
                    parentSelector:
                      type: string
                    insertBeforeSelector:
                      type: string
                  required:
                  - selector
                  - action
                  - attribute
                  additionalProperties: false
            required:
            - variation
            - domMutations
            additionalProperties: false
      required:
      - urlPatterns
      - editorUrl
      - experiment
      - visualChanges
      additionalProperties: false
    ExperimentDecisionFrameworkSettings:
      description: Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields).
      type: object
      properties:
        decisionCriteriaId:
          type: string
        decisionFrameworkMetricOverrides:
          type: array
          items:
            type: object
            properties:
              id:
                description: ID of the metric to override settings for.
                type: string
              targetMDE:
                description: The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0.
                type: number
                exclusiveMinimum: 0
            required:
            - id
            additionalProperties: false
      additionalProperties: false
    ExperimentMetric:
      type: object
      properties:
        metricId:
          type: string
        overrides:
          type: object
          properties:
            delayHours:
              type: number
            windowHours:
              type: number
            window:
              type: string
              enum:
              - conversion
              - lookback
              - ''
            winRiskThreshold:
              deprecated: true
              type: number
            loseRiskThreshold:
              deprecated: true
              type: number
            properPriorOverride:
              type: boolean
            properPriorEnabled:
              type: boolean
            properPriorMean:
              type: number
            properPriorStdDev:
              type: number
            regressionAdjustmentOverride:
              type: boolean
            regressionAdjustmentEnabled:
              type: boolean
            regressionAdjustmentDays:
              type: number
          additionalProperties: false
      required:
      - metricId
      - overrides
      additionalProperties: false
    LookbackOverride:
      description: Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required.
      type: object
      properties:
        type:
          type: string
          enum:
          - date
          - window
        value:
          description: For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string.
          anyOf:
          - description: For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string.
            type: number
          - format: date-time
            description: For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string.
            type: string
        valueUnit:
          description: Used when type is "window". Defaults to "days".
          type: string
          enum:
          - minutes
          - hours
          - days
          - weeks
      required:
      - type
      - value
      additionalProperties: false
    ExperimentMetricOverrideEntry:
      description: Per-metric analysis overrides stored on the experiment (matches internal metricOverrides).
      type: object
      properties:
        id:
          description: ID of the metric to override settings for.
          type: string
        windowType:
          type: string
          enum:
          - conversion
          - lookback
          - ''
        windowHours:
          type: number
        delayHours:
          type: number
        properPriorOverride:
          description: Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present.
          type: boolean
        properPriorEnabled:
          type: boolean
        properPriorMean:
          type: number
        properPriorStdDev:
          type: number
        regressionAdjustmentOverride:
          description: Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present.
          type: boolean
        regressionAdjustmentEnabled:
          type: boolean
        regressionAdjustmentDays:
          type: number
      required:
      - id
      additionalProperties: false
    ExperimentAnalysisSettings:
      type: object
      properties:
        datasourceId:
          type: string
        assignmentQueryId:
          type: string
        experimentId:
          type: string
        segmentId:
          type: string
        queryFilter:
          type: string
        inProgressConversions:
          type: string
          enum:
          - include
          - exclude
        attributionModel:
          description: Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided.
          type: string
          enum:
          - firstExposure
          - experimentDuration
          - lookbackOverride
        lookbackOverride:
          $ref: '#/components/schemas/LookbackOverride'
        statsEngine:
          type: string
          enum:
          - bayesian
          - frequentist
        regressionAdjustmentEnabled:
          type: boolean
        sequentialTestingEnabled:
          type: boolean
        sequentialTestingTuningParameter:
          type: number
        postStratificationEnabled:
          description: When null, the organization default is used.
          anyOf:
          - description: When null, the organization default is used.
            type: boolean
          - description: When null, the organization default is used.
            type: 'null'
        decisionFrameworkSettings:
          $ref: '#/components/schemas/ExperimentDecisionFrameworkSettings'
        metricOverrides:
          description: Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries).
          type: array
          items:
            $ref: '#/components/schemas/ExperimentMetricOverrideEntry'
        goals:
          type: array
          items:
            $ref: '#/components/schemas/ExperimentMetric'
        secondaryMetrics:
          type: array
          items:
            $ref: '#/components/schemas/ExperimentMetric'
        guardrails:
          type: array
          items:
            $ref: '#/components/schemas/ExperimentMetric'
        activationMetric:
          $ref: '#/components/schemas/ExperimentMetric'
      required:
      - datasourceId
      - assignmentQueryId
      - experimentId
      - segmentId
      - queryFilter
      - inProgressConversions
      - attributionModel
      - statsEngine
      - goals
      - secondaryMetrics
      - guardrails
      additionalProperties: false
    Experiment:
      type: object
      properties:
        id:
          type: string
        trackingKey:
          type: string
        dateCreated:
          format: date-time
          type: string
        dateUpdated:
          format: date-time
          type: string
        name:
          type: string
        type:
          type: string
          enum:
          - standard
          - multi-armed-bandit
        project:
          type: string
        hypothesis:
          type: string
        description:
          type: string
        tags:
          type: array
          items:
            type: string
        owner:
          description: The userId of the owner (or raw owner name/email for legacy records)
          type: string
        ownerEmail:
          description: The email address of the owner, when the owner can be resolved to a known user.
          type: string
        archived:
          type: boolean
        status:
          type: string
        autoRefresh:
          type: boolean
        hashAttribute:
          type: string
        fallbackAttribute:
          type: string
        hashVersion:
          anyOf:
          - type: number
            const: 1
          - type: number
            const: 2
        disableStickyBucketing:
          type: boolean
        bucketVersion:
          type: number
        minBucketVersion:
          type: number
        variations:
          type: array
          items:
            type: object
            properties:
              variationId:
                type: string
              key:
                type: string
              name:
                type: string
              description:
                type: string
              screenshots:
                type: array
                items:
                  type: string
            required:
            - variationId
            - key
            - name
            - description
            - screenshots
            additionalProperties: false
        phases:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              dateStarted:
                type: string
              dateEnded:
                type: string
              reasonForStopping:
                type: string
              seed:
                type: string
              coverage:
                type: number
              trafficSplit:
                type: array
                items:
                  type: object
                  properties:
                    variationId:
                      type: string
                    weight:
                      type: number
                  required:
                  - variationId
                  - weight
                  additionalProperties: false
              namespace:
                type: object
                properties:
                  namespaceId:
                    type: string
                  enabled:
                    type: boolean
                  range:
                    minItems: 2
                    maxItems: 2
                    type: array
                    items:
                      type: number
                  ranges:
                    type: array
                    items:
                      type: array
                      prefixItems:
                      - type: number
                      - type: number
                required:
                - namespaceId
                additionalProperties: false
              targetingCondition:
                type: string
              prerequisites:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    condition:
                      type: string
                  required:
                  - id
                  - condition
                  additionalProperties: false
              savedGroupTargeting:
                type: array
                items:
                  type: object
                  properties:
                    matchType:
                      type: string
                      enum:
                      - all
                      - any
                      - none
                    savedGroups:
                      type: array
                      items:
                        type: string
                  required:
                  - matchType
                  - savedGroups
                  additionalProperties: false
            required:
            - name
            - dateStarted
            - dateEnded
            - reasonForStopping
            - seed
            - coverage
            - trafficSplit
            - targetingCondition
            additionalProperties: false
        settings:
          $ref: '#/components/schemas/ExperimentAnalysisSettings'
        resultSummary:
          type: object
          properties:
            status:
              type: string
            winner:
              type: string
            conclusions:
              type: string
            releasedVariationId:
              type: string
            excludeFromPayload:
              type: boolean
          required:
          - status
          - winner
          - conclusions
          - releasedVariationId
          - excludeFromPayload
          additionalProperties: false
        shareLevel:
          type: string
          enum:
          - public
          - organization
        publicUrl:
          type: string
        banditScheduleValue:
          type: number
        banditScheduleUnit:
          type: string
          enum:
          - days
          - hours
        banditBurnInValue:
          type: number
        banditBurnInUnit:
          type: string
          enum:
          - days
          - hours
        banditConversionWindowValue:
          type: number
        banditConversionWindowUnit:
          type: string
          enum:
          - days
          - hours
        linkedFeatures:
          type: array
          items:
            type: string
        hasVisualChangesets:
          type: boolean
        hasURLRedirects:
          type: boolean
        customFields:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
        customMetricSlices:
          description: Custom slices that apply to ALL applicable metrics in the experiment
          type: array
          items:
            type: object
            properties:
              slices:
                type: array
                items:
                  type: object
                  properties:
                    column:
                      type: string
                    levels:
                      type: array
                      items:
                        type: string
                  required:
                  - column
                  - levels
                  additionalProperties: false
            required:
            - slices
            additionalProperties: false
        defaultDashboardId:
          description: ID of the default dashboard for this experiment.
          type: string
        templateId:
          type: string
      required:
      - id
      - trackingKey
      - dateCreated
      - dateUpdated
      - name
      - type
      - project
      - hypothesis
      - description
      - tags
      - owner
      - archived
      - status
      - autoRefresh
      - hashAttribute
      - hashVersion
      - variations
      - phases
      - settings
      additionalProperties: false
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'If using Bearer auth, pass the Secret Key as the token:

        ```bash

        curl https://api.growthbook.io/api/v1/features   -H "Authorization: Bearer secret_abc123DEF456"

        ```

        '
    basicAuth:
      type: http
      scheme: basic
      description: 'If using HTTP Basic auth, pass the Secret Key as the username and leave the password blank:

        ```bash

        curl https://api.growthbook.io/api/v1/features   -u secret_abc123DEF456:

        # The ":" at the end stops curl from asking for a password

        ```

        '
x-tagGroups:
- name: Endpoints
  tags:
  - projects
  - environments
  - features-v2
  - feature-revisions-v2
  - features
  - feature-revisions
  - ramp-schedules
  - data-sources
  - fact-tables
  - fact-metrics
  - metrics
  - experiments
  - namespaces
  - snapshots
  - dimensions
  - segments
  - sdk-connections
  - visual-changesets
  - saved-groups
  - organizations
  - members
  - code-references
  - archetypes
  - queries
  - settings
  - attributes
  - usage
  - Dashboards
  - CustomFields
  - MetricGroups
  - Teams
  - ExperimentTemplates
  - AnalyticsExplorations
  - RampScheduleTemplates
- name: Models
  tags:
  - AnalyticsExploration_model
  - Archetype_model
  - Attribute_model
  - CodeRef_model
  - CustomField_model
  - Dashboard_model
  - DataSource_model
  - Dimension_model
  - Environment_model
  - Experiment_model
  - ExperimentAnalysisSettings_model
  - ExperimentDecisionFrameworkSettings_model
  - ExperimentMetric_model
  - ExperimentMetricOverrideEntry_model
  - ExperimentResults_model
  - ExperimentSnapshot_model
  - ExperimentTemplate_model
  - ExperimentWithEnhancedStatus_model
  - FactMetric_model
  - FactTable_model
  - FactTableColumn_model
  - FactTableFilter_model
  - Feature_model
  - FeatureBaseRule_model
  - FeatureDefinition_model
  - FeatureEnvironment_model
  - FeatureEnvironmentV2_model
  - FeatureExperimentRefRule_model
  - FeatureExperimentRule_model
  - FeatureForceRule_model
  - FeatureRevision_model
  - FeatureRevisionV2_model
  - FeatureRolloutRule_model
  - FeatureRule_model
  - FeatureRuleV2_model
  - FeatureSafeRolloutRule_model
  - FeatureV2_model
  - FeatureWithRevisions_model
  - FeatureWithRevisionsV2_model
  - InformationSchema_model
  - InformationSchemaTable_model
  - LookbackOverride_model
  - Member_model
  - Metric_model
  - MetricAnalysis_model
  - MetricGroup_model
  - MetricUsage_model
  - Namespace_model
  - NamespaceExperimentMember_model
  - Organization_model
  - PaginationFields_model
  - Project_model
  - Query_model
  - RampSchedule_model
  - RampScheduleTemplate_model
  - SavedGroup_model
  - ScheduleRule_model
  - SdkConnection_model
  - Segment_model
  - Settings_model
  - Team_model
  - VisualChange_model
  - VisualChangeset_model