openapi: 3.2.0 info: title: A/B Testing Abtesting API summary: The Algolia A/B Testing API lets you manage your Algolia A/B tests to optimize your search experience description: "## Base URLs\n\nBase URLs for the A/B testing API:\n\n- `https://analytics.us.algolia.com`\n- `https://analytics.de.algolia.com`\n- `https://analytics.algolia.com` (alias of `analytics.us.algolia.com`)\n\nUse the URL that matches your [analytics region](https://dashboard.algolia.com/account/infrastructure/analytics).\n\n**All requests must use HTTPS.**\n\n## Availability and authentication\n\nAccess to the A/B testing API is available as part of the [Premium or Elevate plans](https://www.algolia.com/pricing).\n\nAdd these headers to authenticate requests:\n\n- `x-algolia-application-id`. Your Algolia application ID.\n- `x-algolia-api-key`. An API key with the necessary permissions to make the request.\n The required access control list (ACL) to make a request is listed in each endpoint's reference.\n\nYou can find your application ID and API key in the [Algolia dashboard](https://dashboard.algolia.com/account/api-keys).\n\n## Rate limits\n\nYou can make up to **100 requests per minute per app** to the A/B testing API.\nThe response includes headers with information about the limits.\n\n## Parameters\n\nQuery parameters must be [URL-encoded](https://developer.mozilla.org/en-US/docs/Glossary/Percent-encoding).\nNon-ASCII characters must be UTF-8 encoded.\nPlus characters (`+`) are interpreted as spaces.\n\n## Response status and errors\n\nThe A/B testing API returns JSON responses.\nSince JSON doesn't guarantee any specific ordering, don't rely on the order of attributes in the API response.\n\nSuccessful responses return `2xx` statuses. Client errors return `4xx` statuses. Server errors return `5xx` statuses.\nError responses have a `message` property with more information.\n\n## Version\n\nVersion 2 of the A/B Testing API, indicated by the `/2/` in each endpoint's URL, is deprecated.\nUse [version 3](https://www.algolia.com/doc/rest-api/abtesting-v3) instead.\n" version: 2.0.0 servers: - url: https://analytics.{region}.algolia.com variables: region: description: The region where your Algolia application is hosted. enum: - us - de default: us - url: https://analytics.algolia.com security: - appId: [] apiKey: [] tags: - name: abtesting paths: /{path}: get: operationId: customGet summary: Send requests to the Algolia REST API description: This method lets you send requests to the Algolia REST API. parameters: - $ref: '#/components/parameters/PathInPath' - $ref: '#/components/parameters/Parameters' responses: '200': description: OK content: application/json: schema: type: object '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' tags: - abtesting post: operationId: customPost requestBody: description: Parameters to send with the custom request. content: application/json: schema: type: object summary: Send requests to the Algolia REST API description: This method lets you send requests to the Algolia REST API. parameters: - $ref: '#/components/parameters/PathInPath' - $ref: '#/components/parameters/Parameters' responses: '200': description: OK content: application/json: schema: type: object '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' tags: - abtesting put: operationId: customPut requestBody: description: Parameters to send with the custom request. content: application/json: schema: type: object summary: Send requests to the Algolia REST API description: This method lets you send requests to the Algolia REST API. parameters: - $ref: '#/components/parameters/PathInPath' - $ref: '#/components/parameters/Parameters' responses: '200': description: OK content: application/json: schema: type: object '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' tags: - abtesting delete: operationId: customDelete summary: Send requests to the Algolia REST API description: This method lets you send requests to the Algolia REST API. parameters: - $ref: '#/components/parameters/PathInPath' - $ref: '#/components/parameters/Parameters' responses: '200': description: OK content: application/json: schema: type: object '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' tags: - abtesting /2/abtests: post: tags: - abtesting operationId: addABTests deprecated: true x-acl: - editSettings summary: Create an A/B test description: 'This endpoint is deprecated. Use the A/B Testing API v3 instead. Replaced by `POST /3/abtests`. Creates a new A/B test. ' requestBody: required: true content: application/json: schema: title: addABTestsRequest type: object additionalProperties: false properties: name: $ref: '#/components/schemas/name' variants: type: array description: A/B test variants. minItems: 2 maxItems: 2 items: $ref: '#/components/schemas/AddABTestsVariant' endAt: $ref: '#/components/schemas/endAt' required: - name - variants - endAt responses: '200': description: OK headers: x-ratelimit-limit: $ref: '#/components/headers/x-ratelimit-limit' x-ratelimit-remaining: $ref: '#/components/headers/x-ratelimit-remaining' x-ratelimit-reset: $ref: '#/components/headers/x-ratelimit-reset' content: application/json: schema: $ref: '#/components/schemas/ABTestResponse' '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' get: tags: - abtesting operationId: listABTests deprecated: true x-mcp-tool: true x-acl: - analytics summary: List all A/B tests description: 'This endpoint is deprecated. Use the A/B Testing API v3 instead. Replaced by `GET /3/abtests`. Lists all A/B tests you configured for this application. ' parameters: - name: offset in: query description: Position of the first item to return. required: false schema: type: integer default: 0 minimum: 0 - name: limit in: query description: Number of items to return. required: false schema: type: integer default: 10 - name: indexPrefix in: query description: Index name prefix. Only A/B tests for indices starting with this string are included in the response. example: dev_ schema: type: string - name: indexSuffix in: query description: Index name suffix. Only A/B tests for indices ending with this string are included in the response. example: _development schema: type: string responses: '200': description: OK headers: x-ratelimit-limit: $ref: '#/components/headers/x-ratelimit-limit' x-ratelimit-remaining: $ref: '#/components/headers/x-ratelimit-remaining' x-ratelimit-reset: $ref: '#/components/headers/x-ratelimit-reset' content: application/json: schema: title: listABTestsResponse type: object additionalProperties: false properties: abtests: $ref: '#/components/schemas/ABTests' count: type: integer description: Number of A/B tests. example: 10 total: type: integer description: Number of retrievable A/B tests. example: 12 required: - abtests - count - total '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' /2/abtests/{id}: get: tags: - abtesting operationId: getABTest deprecated: true x-acl: - analytics summary: Retrieve A/B test details description: 'This endpoint is deprecated. Use the A/B Testing API v3 instead. Replaced by `GET /3/abtests/{id}`. Retrieves the details for an A/B test by its ID. ' parameters: - $ref: '#/components/parameters/ID' responses: '200': description: OK headers: x-ratelimit-limit: $ref: '#/components/headers/x-ratelimit-limit' x-ratelimit-remaining: $ref: '#/components/headers/x-ratelimit-remaining' x-ratelimit-reset: $ref: '#/components/headers/x-ratelimit-reset' content: application/json: schema: $ref: '#/components/schemas/ABTest' '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' delete: tags: - abtesting operationId: deleteABTest deprecated: true x-acl: - editSettings summary: Delete an A/B test description: 'This endpoint is deprecated. Use the A/B Testing API v3 instead. Replaced by `DELETE /3/abtests/{id}`. Deletes an A/B test by its ID. ' parameters: - $ref: '#/components/parameters/ID' responses: '200': description: OK headers: x-ratelimit-limit: $ref: '#/components/headers/x-ratelimit-limit' x-ratelimit-remaining: $ref: '#/components/headers/x-ratelimit-remaining' x-ratelimit-reset: $ref: '#/components/headers/x-ratelimit-reset' content: application/json: schema: $ref: '#/components/schemas/ABTestResponse' '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' /2/abtests/{id}/stop: post: tags: - abtesting operationId: stopABTest deprecated: true x-acl: - editSettings summary: Stop an A/B test description: 'This endpoint is deprecated. Use the A/B Testing API v3 instead. Replaced by `POST /3/abtests/{id}/stop`. Stops an A/B test by its ID. You can''t restart stopped A/B tests. ' parameters: - $ref: '#/components/parameters/ID' responses: '200': description: OK headers: x-ratelimit-limit: $ref: '#/components/headers/x-ratelimit-limit' x-ratelimit-remaining: $ref: '#/components/headers/x-ratelimit-remaining' x-ratelimit-reset: $ref: '#/components/headers/x-ratelimit-reset' content: application/json: schema: $ref: '#/components/schemas/ABTestResponse' '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' /2/abtests/estimate: post: tags: - abtesting operationId: estimateABTest deprecated: true x-acl: - analytics summary: Estimate the sample size and duration of an A/B test description: 'This endpoint is deprecated. Use the A/B Testing API v3 instead. Replaced by `POST /3/abtests/estimate`. Given the traffic percentage and the expected effect size, this endpoint estimates the sample size and duration of an A/B test based on historical traffic. ' requestBody: required: true content: application/json: schema: title: estimateABTestRequest type: object additionalProperties: false properties: configuration: title: estimateConfiguration type: object description: A/B test configuration for estimating the sample size and duration using minimum detectable effect. properties: featureFilters: $ref: '#/components/schemas/FeatureFilters' outliers: $ref: '#/components/schemas/Outliers' emptySearch: $ref: '#/components/schemas/EmptySearch' minimumDetectableEffect: $ref: '#/components/schemas/MinimumDetectableEffect' required: - minimumDetectableEffect variants: type: array description: A/B test variants. minItems: 2 maxItems: 2 items: $ref: '#/components/schemas/AddABTestsVariant' required: - configuration - variants responses: '200': description: OK headers: x-ratelimit-limit: $ref: '#/components/headers/x-ratelimit-limit' x-ratelimit-remaining: $ref: '#/components/headers/x-ratelimit-remaining' x-ratelimit-reset: $ref: '#/components/headers/x-ratelimit-reset' content: application/json: schema: $ref: '#/components/schemas/EstimateABTestResponse' '400': $ref: '#/components/responses/BadRequest' '402': $ref: '#/components/responses/FeatureNotEnabled' '403': $ref: '#/components/responses/MethodNotAllowed' '404': $ref: '#/components/responses/IndexNotFound' /setClientApiKey: get: x-helper: true x-asynchronous-helper: false x-acl: [] tags: - abtesting operationId: setClientApiKey summary: Switch the API key used to authenticate requests description: 'Switch the API key used to authenticate requests. ' parameters: - in: query name: apiKey description: API key to use for subsequent requests. required: true schema: type: string responses: '204': description: No content. components: schemas: ABTests: oneOf: - type: array description: The list of A/B tests, null if no A/B tests are configured for this application. items: $ref: '#/components/schemas/ABTest' - type: 'null' currency: type: object properties: currency: type: string description: Currency code. example: USD revenue: type: number format: double description: Revenue for this currency. example: 120 mean: type: number format: double description: Mean for this currency. example: 53.7 standardDeviation: type: number format: double description: Standard deviation for this currency. example: 12.3 winsorizedAmount: type: number format: double description: The amount of revenue for this currency that was removed after capping purchase amounts to the 95th percentile. example: 23 variants: type: array description: 'A/B test variants. The first variant is your _control_ index, typically your production index. The second variant is an index with changed settings that you want to test against the control. ' items: $ref: '#/components/schemas/variant' createdAt: type: string description: Date and time when the A/B test was created, in RFC 3339 format. example: '2023-06-15T15:06:04.249906Z' ABTest: type: object additionalProperties: false properties: abTestID: $ref: '#/components/schemas/abTestID' clickSignificance: description: 'A/B test significance calculated from click events. Values of 0.95 or higher can be considered significant, that is, the difference between A and B variants is _not_ due to random variations. Lower values have a. ' oneOf: - type: number format: double example: 1 - type: 'null' conversionSignificance: description: 'A/B test significance calculated from conversion events. Values of 0.95 or higher can be considered significant, that is, the difference between A and B variants is _not_ due to random variations. ' oneOf: - type: number format: double example: 1 - type: 'null' addToCartSignificance: description: 'A/B test significance calculated from add-to-cart events. Values of 0.95 or higher can be considered significant, that is, the difference between A and B variants is _not_ due to random variations. ' oneOf: - type: number format: double example: 1 - type: 'null' purchaseSignificance: description: 'A/B test significance calculated from purchase events. Values of 0.95 or higher can be considered significant, that is, the difference between A and B variants is _not_ due to random variations. ' oneOf: - type: number format: double example: 1 - type: 'null' revenueSignificance: description: 'A/B test significance calculated from revenue data. Values of 0.95 or higher can be considered significant, that is, the difference between A and B variants is _not_ due to random variations. ' oneOf: - type: object additionalProperties: type: number format: double x-additionalPropertiesName: currency code example: USD: 1 EUR: 0.87 - type: 'null' updatedAt: $ref: '#/components/schemas/updatedAt' createdAt: $ref: '#/components/schemas/createdAt' endAt: $ref: '#/components/schemas/endAt' stoppedAt: $ref: '#/components/schemas/stoppedAt' name: $ref: '#/components/schemas/name' status: $ref: '#/components/schemas/Status' variants: $ref: '#/components/schemas/variants' configuration: $ref: '#/components/schemas/ABTestConfiguration' required: - status - name - createdAt - endAt - updatedAt - abTestID - variants Outliers: type: object description: Configuration for handling outliers. properties: exclude: type: boolean description: Whether to exclude outliers when calculating A/B test results. default: true ABTestConfiguration: title: configuration type: object description: A/B test configuration. properties: featureFilters: $ref: '#/components/schemas/FeatureFilters' outliers: $ref: '#/components/schemas/Outliers' emptySearch: $ref: '#/components/schemas/EmptySearch' minimumDetectableEffect: $ref: '#/components/schemas/MinimumDetectableEffect' MinimumDetectableEffect: type: object description: Configuration for the smallest difference between test variants you want to detect. properties: size: type: number format: double minimum: 0 maximum: 1 description: 'Smallest difference in an observable metric between variants. For example, to detect a 10% difference between variants, set this value to 0.1. ' metric: $ref: '#/components/schemas/EffectMetric' required: - size - metric trafficPercentage: type: integer description: Percentage of search requests each variant receives. minimum: 0 maximum: 100 example: 60 EmptySearch: type: object description: Configuration for handling empty searches. properties: exclude: type: boolean description: Whether to exclude empty searches when calculating A/B test results. EffectMetric: type: string description: Metric for which you want to detect the smallest relative difference. enum: - addToCartRate - clickThroughRate - conversionRate - purchaseRate FeatureFilters: type: object description: Configuration of feature-based filters applied to the A/B test population. properties: dynamicReRanking: type: boolean description: Whether to apply Dynamic Re-Ranking feature filters. aiPerso: type: boolean description: Whether to apply AI Personalization feature filters. multiSignalRanking: type: boolean description: Whether to apply Multi-Signal Re-Ranking feature filters. AddABTestsVariant: oneOf: - title: Variant $ref: '#/components/schemas/abTestsVariant' - title: Variant with search parameters $ref: '#/components/schemas/abTestsVariantSearchParams' variant: type: object additionalProperties: false properties: addToCartCount: type: integer description: Number of add-to-cart events for this variant. example: 0 addToCartRate: oneOf: - type: number format: double description: '[Add-to-cart rate](https://www.algolia.com/doc/guides/search-analytics/concepts/metrics/#add-to-cart-rate) for this variant. ' example: 0 - type: 'null' averageClickPosition: oneOf: - type: number format: double description: '[Average click position](https://www.algolia.com/doc/guides/search-analytics/concepts/metrics/#click-position) for this variant. ' example: 29.12342 - type: 'null' clickCount: type: integer description: Number of click events for this variant. example: 65131 clickThroughRate: oneOf: - type: number format: double description: '[Click-through rate](https://www.algolia.com/doc/guides/search-analytics/concepts/metrics/#click-through-rate) for this variant. ' example: 0.22219857724813036 - type: 'null' conversionCount: type: integer description: Number of click events for this variant. example: 4785 conversionRate: oneOf: - type: number format: double description: '[Conversion rate](https://www.algolia.com/doc/guides/search-analytics/concepts/metrics/#conversion-rate) for this variant. ' example: 0.14546725846658964 - type: 'null' currencies: $ref: '#/components/schemas/currencies' description: $ref: '#/components/schemas/description' estimatedSampleSize: type: integer description: 'Estimated number of searches required to achieve the desired statistical significance. The A/B test configuration must include a `mininmumDetectableEffect` setting for this number to be included in the response. ' example: 0 filterEffects: $ref: '#/components/schemas/filterEffects' index: $ref: '#/components/schemas/index' noResultCount: oneOf: - type: integer description: Number of [searches without results](https://www.algolia.com/doc/guides/search-analytics/concepts/metrics/#searches-without-results) for this variant. example: 0 - type: 'null' purchaseCount: type: integer description: Number of purchase events for this variant. example: 0 purchaseRate: oneOf: - type: number format: double description: '[Purchase rate](https://www.algolia.com/doc/guides/search-analytics/concepts/metrics/#purchase-rate) for this variant. ' example: 0 - type: 'null' searchCount: oneOf: - type: integer description: Number of searches for this variant. example: 86269 - type: 'null' trackedSearchCount: $ref: '#/components/schemas/trackedSearchCount' trafficPercentage: $ref: '#/components/schemas/trafficPercentage' userCount: oneOf: - type: integer description: Number of users that made searches to this variant. example: 55501 - type: 'null' trackedUserCount: oneOf: - type: integer description: Number of users that made tracked searches to this variant. example: 55501 - type: 'null' required: - userCount - trackedUserCount - trafficPercentage - searchCount - noResultCount - index - conversionCount - clickCount - addToCartCount - purchaseCount stoppedAt: type: - string - 'null' description: Date and time when the A/B test was stopped, in RFC 3339 format. example: '2023-06-15T15:06:44.400601Z' updatedAt: type: string description: Date and time when the A/B test was last updated, in RFC 3339 format. example: '2023-06-15T15:06:44.400601Z' ABTestResponse: type: object additionalProperties: false properties: index: $ref: '#/components/schemas/index' abTestID: $ref: '#/components/schemas/abTestID' taskID: $ref: '#/components/schemas/taskID' required: - abTestID - index - taskID index: type: string description: Index name of the A/B test variant (case-sensitive). example: delcourt_production filterEffects: type: object description: A/B test filter effects resulting from configuration settings. properties: outliers: title: outliersFilter type: object description: Outliers removed from the A/B test as a result of configuration settings. example: usersCount: 1 trackedSearchesCount: 237 properties: usersCount: type: integer description: Number of users removed from the A/B test. example: 1 trackedSearchesCount: type: integer description: Number of tracked searches removed from the A/B test. example: 237 emptySearch: title: emptySearchFilter type: object description: Empty searches removed from the A/B test as a result of configuration settings. example: usersCount: 1 trackedSearchesCount: 237 properties: usersCount: type: integer description: Number of users removed from the A/B test. example: 1 trackedSearchesCount: type: integer description: Number of tracked searches removed from the A/B test. example: 237 Status: type: string description: 'A/B test status. - `active`. The A/B test is live and search traffic is split between the two variants. - `stopped`. You stopped the A/B test. The A/B test data is still available for analysis. - `expired`. The A/B test was automatically stopped after reaching its end date. - `failed`. Creating the A/B test failed. ' example: active enum: - active - stopped - expired - failed trackedSearchCount: type: integer example: 2 default: 0 description: Number of tracked searches. Tracked searches are search requests where the `clickAnalytics` parameter is true. customSearchParams: type: object description: 'Search parameters to add to the test variant. Only use this parameter if the two variants use the same index. ' example: typoTolerance: false synonyms: false additionalProperties: false properties: customSearchParameters: type: object required: - customSearchParameters x-discriminator-fields: - customSearchParameters description: type: string description: Description for this variant. example: Current production index endAt: type: string description: End date and time of the A/B test, in RFC 3339 format. example: '2023-06-17T00:00:00Z' abTestsVariant: type: object additionalProperties: false properties: index: $ref: '#/components/schemas/index' trafficPercentage: $ref: '#/components/schemas/trafficPercentage' description: $ref: '#/components/schemas/description' required: - index - trafficPercentage currencies: type: object description: A/B test currencies. example: USD: currency: USD revenue: 120 mean: 53.7 standardDeviation: 12.3 winsorizedAmount: 23 EUR: currency: EUR revenue: 100 mean: 43.7 standardDeviation: 10.3 winsorizedAmount: 10 additionalProperties: $ref: '#/components/schemas/currency' x-additionalPropertiesName: currency code abTestID: type: integer description: Unique A/B test identifier. example: 224 taskID: type: integer format: int64 example: 1514562690001 description: 'Unique identifier of a task. A successful API response means that a task was added to a queue. It might not run immediately. You can check the task''s progress with the [`task` operation](https://www.algolia.com/doc/rest-api/search/get-task) and this task ID. ' EstimateABTestResponse: type: object properties: durationDays: type: integer format: int64 description: Estimated number of days needed to reach the sample sizes required for detecting the configured effect. This value is based on historical traffic. example: 21 sampleSizes: type: array description: 'Sample size estimates for each variant. The first element is the control variant. Each element is the estimated number of searches required to achieve the desired statistical significance. ' items: type: integer format: int64 description: Number of tracked searches needed to be able to detect the configured effect for the control variant. example: 23415 ErrorBase: description: Error. type: object x-keep-model: true additionalProperties: true properties: message: type: string example: Invalid Application-Id or API-Key name: type: string description: A/B test name. example: Custom ranking sales rank test abTestsVariantSearchParams: allOf: - $ref: '#/components/schemas/abTestsVariant' - $ref: '#/components/schemas/customSearchParams' parameters: PathInPath: name: path in: path description: Path of the endpoint, for example `1/newFeature`. required: true schema: type: string example: /keys Parameters: name: parameters in: query description: Query parameters to apply to the current query. schema: type: object additionalProperties: true ID: in: path name: id description: Unique A/B test identifier. required: true schema: $ref: '#/components/schemas/abTestID' headers: x-ratelimit-remaining: description: Number of remaining requests in the current period. example: 99 schema: type: integer x-ratelimit-reset: description: Timestamp when the rate limit will reset, measured in seconds since the Unix epoch. example: 1710682486 schema: type: integer x-ratelimit-limit: description: Number of allowed requests per one minute. example: 100 schema: type: integer responses: MethodNotAllowed: description: Method not allowed with this API key. content: application/json: schema: $ref: '#/components/schemas/ErrorBase' IndexNotFound: description: Index not found. content: application/json: schema: $ref: '#/components/schemas/ErrorBase' BadRequest: description: Bad request or request arguments. content: application/json: schema: $ref: '#/components/schemas/ErrorBase' FeatureNotEnabled: description: This feature is not enabled on your Algolia account. content: application/json: schema: $ref: '#/components/schemas/ErrorBase' securitySchemes: appId: type: apiKey in: header name: x-algolia-application-id description: Your Algolia application ID. apiKey: type: apiKey in: header name: x-algolia-api-key description: 'Your Algolia API key with the necessary permissions to make the request. Permissions are controlled through access control lists (ACL) and access restrictions. The required ACL to make a request is listed in each endpoint''s reference. ' externalDocs: url: https://www.algolia.com/doc/guides/ab-testing/what-is-ab-testing description: A/B testing. x-tagGroups: - name: General tags: - abtest