---
title: "Create a website test"
method: POST
path: "/v1/optimize/tests"
tags: ["Optimize"]
---

# Create a website test

`POST /v1/optimize/tests`

## Request

- Base URL: `https://api.revdesk.com`
- URL: `https://api.revdesk.com/v1/optimize/tests`
- Auth: HTTP bearer

Creates a test on one page with a control plus the variants you send. Each variant is a list of DOM operations (text, attributes, classes, inline style, hide, link targets) applied by the tag. Pass a `goal` to create one or `goal_id` to reuse one. With `start: true` the test begins immediately; otherwise it is saved as a draft.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `property_id` string
  - `name` string, required
  - `page_url` string, required
  - `url_match_type` 'exact' | 'prefix' | 'regex'
  - `goal` object
    - `type` 'form_submit' | 'tel_click' | 'cta_click' | 'url_visit' | 'selector_click', required
    - `selector` string
    - `url_match_type` 'exact' | 'prefix' | 'regex'
    - `url_pattern` string
  - `goal_id` string
  - `hypothesis` string
  - `traffic_split` number
  - `variants` object[], required
    - `name` string, required
    - `hypothesis` string
    - `ops` union[], required
      - union
        - object
          - `selector` string, required
          - `nth` integer
          - `op` 'setText', required
          - `value` string, required
        - object
          - `selector` string, required
          - `nth` integer
          - `op` 'setAttribute', required
          - `name` string, required
          - `value` string, required
        - object
          - `selector` string, required
          - `nth` integer
          - `op` 'addClass', required
          - `value` string, required
        - object
          - `selector` string, required
          - `nth` integer
          - `op` 'removeClass', required
          - `value` string, required
        - object
          - `selector` string, required
          - `nth` integer
          - `op` 'setStyle', required
          - `styles` object, required
        - object
          - `selector` string, required
          - `nth` integer
          - `op` 'hide', required
        - object
          - `selector` string, required
          - `nth` integer
          - `op` 'replaceHref', required
          - `value` string, required
    - `weight` number
  - `start` boolean

## Response `201`

Success

- object
  - `data` object, required
    - `id` string, required
    - `name` string, required
    - `hypothesis` string, nullable, required
    - `status` 'draft' | 'running' | 'paused' | 'completed' | 'shipped' | 'archived', required
    - `kind` 'variation' | 'split_url', required
    - `page_url` string, required
    - `url_match_type` 'exact' | 'prefix' | 'regex', required
    - `goal` object, nullable, required
      - `id` string, required
      - `type` 'form_submit' | 'tel_click' | 'cta_click' | 'url_visit' | 'selector_click', required
      - `selector` string, nullable, required
      - `url_pattern` string, nullable, required
    - `traffic_split` number, required
    - `variants` object[], required
      - `id` string, required
      - `name` string, required
      - `is_control` boolean, required
      - `weight` number, required
      - `ops` union[], required
        - union
          - object
            - `selector` string, required
            - `nth` integer
            - `op` 'setText', required
            - `value` string, required
          - object
            - `selector` string, required
            - `nth` integer
            - `op` 'setAttribute', required
            - `name` string, required
            - `value` string, required
          - object
            - `selector` string, required
            - `nth` integer
            - `op` 'addClass', required
            - `value` string, required
          - object
            - `selector` string, required
            - `nth` integer
            - `op` 'removeClass', required
            - `value` string, required
          - object
            - `selector` string, required
            - `nth` integer
            - `op` 'setStyle', required
            - `styles` object, required
          - object
            - `selector` string, required
            - `nth` integer
            - `op` 'hide', required
          - object
            - `selector` string, required
            - `nth` integer
            - `op` 'replaceHref', required
            - `value` string, required
      - `redirect_url` string, nullable, required
    - `started_at` string, nullable, required
    - `completed_at` string, nullable, required
    - `shipped_at` string, nullable, required
    - `winner_variant_id` string, nullable, required
    - `created_at` string, required

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `409`: Conflict (incl. idempotency conflicts)
- `429`: Rate limited

---

[API](https://skmtc.dev/revdesk/apis/revdesk-v1-api.md) · [All operations](https://skmtc.dev/revdesk/apis/revdesk-v1-api/llms.txt) · [OpenAPI document](https://skmtc.dev/revdesk/apis/revdesk-v1-api/revisions/fcbd43530a48?raw)
