---
title: "Rerun backtests (v2)"
method: POST
path: "/api/v1/research/backtests/rerun-v2"
tags: ["research"]
---

# Rerun backtests (v2)

`POST /api/v1/research/backtests/rerun-v2`

## Request

- Base URL: `https://point11.ai`
- URL: `https://point11.ai/api/v1/research/backtests/rerun-v2`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://auth.point11.ai/oauth2/authorize`, token URL `https://auth.point11.ai/oauth2/token`)

Run a Research backtest again on the twins its first run asked: on another respondent model, with customer assumptions added for its twins, or both. Added assumptions are statements every twin of that run takes as true of themselves beside the study's own (at most 10 in all, each at most 2,000 characters), screened as a launch's study is. Every interview is billed as delivered usage, as any study's. Refused 409 PRECONDITION_FAILED until the first run has finished. Returns the new run; follow it with platform_runs_get_v2 and compare it with research_backtests_get. `id` is the campaign's id.

## Headers

- `Point11-Organization` string, uuid
- `Idempotency-Key` string, uuid, required

## Request body

- ResearchBacktestsRerunV2Request
  - `id` string, uuid, required: The backtest's campaign id.
  - `respondentModelId` 'anthropic/claude-sonnet-5' | 'openai/gpt-6-astra' | 'google/gemini-3.8-flash' | 'xai/grok-4.3', nullable: The respondent model the twins answer on; absent or null keeps the default.
  - `assumptions` string[]: Customer assumptions to add for this run's twins, in order: statements each twin takes as true of themselves beside its own facts, after any the study already states. Each is at most 2,000 characters and none is empty; the study's and these together are at most 10. Absent or empty adds none.

## Response `202`

Accepted: the durable run started. Follow it with `GET /api/v1/platform/runs-v2/{id}`.

- ResearchBacktestsRerunV2Response
  - `runId` string, uuid, required
  - `entryId` string, required: The campaign entry this request started; read its progress with campaigns.campaign-entries.get.v1.
  - `campaignId` string, uuid, required

## Other responses

- `400`: The input, query, or Idempotency-Key is invalid.
- `401`: The bearer is missing, expired, or not accepted.
- `402`: Billing refused the write: the code names the reason and `details.reason` carries it.
- `403`: The credential lacks the operation's scope or role, or the operation needs a different door.
- `404`: The resource or organization does not exist for this caller.
- `405`: This path takes another HTTP method, named in `Allow`.
- `409`: The request conflicts with current state or with prior use of its Idempotency-Key.
- `413`: The request, or the answer it asks for, is too large; narrow it.
- `429`: The credential's rate budget is spent; retry after `Retry-After` seconds.
- `500`: An unexpected server failure; retry later. Only `request_id` identifies it.
- `503`: A dependency is temporarily unavailable; retry after `Retry-After` seconds.
- `default`: Another status a product answers for its own refusal (for example `415` for an unsupported attachment); branch on `code`.

---

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