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

# Projects and repositories

> Projects, experiments, GitHub App installations, and connected integrations.

## Projects

Projects scope experiments, agents, and the quality gate. Scope: `projects:read` / `projects:write`.

```
GET    /api/v1.0/projects                      # non-archived projects for your team
POST   /api/v1.0/projects                      # create
GET    /api/v1.0/projects/<project_id>         # full config
PUT    /api/v1.0/projects/<project_id>         # name, description, or config (merged)
DELETE /api/v1.0/projects/<project_id>         # hard delete; experiments are unlinked, not deleted
```

### Create from repos

```
POST /api/v1.0/projects/from-repos
```

| Field | Type | Required | Description |
| - | - | - | - |
| `name` | string | Yes | Project name |
| `repos` | array | No | `[{url, name?}]`; each linked repo gets an experiment history |
| `description` | string | No | |
| `team_id` | string | No for users, yes for service tokens | |
| `scope_context` | string | No | Free-text scope that steers ranking and gates |
| `skip_extraction` | boolean | No | Create the history rows without dispatching extraction |

### Quality gate

```
POST   /api/v1.0/projects/<project_id>/eval-templates/<template_name>   # body = the template definition
GET    /api/v1.0/projects/<project_id>/decision-policy                  # null when unset
POST   /api/v1.0/projects/<project_id>/decision-policy                  # body = full DecisionPolicy; 400 with `detail` on a bad payload
DELETE /api/v1.0/projects/<project_id>/decision-policy
GET    /api/v1.0/projects/<project_id>/metrics                          # per-metric trend: current, baseline, direction
```

### Experiment history

```
GET  /api/v1.0/projects/<project_id>/experiment-history           # merged rows across linked histories, with per-history status
POST /api/v1.0/projects/<project_id>/experiment-history/refresh   # re-run extraction on every linked repo
```

The underlying histories are also addressable directly: `POST /experiment-histories`, `GET|DELETE /experiment-histories/<id>`, `GET .../status`, `POST .../extract`, `POST .../report`, `POST .../score-candidates`, `POST .../refit-preference-model`. Scope: `experiments:*`.

***

## Experiments

Manage experiments, track outcomes, and log decisions. Scope: `experiments:read` / `experiments:write`.

### List Experiments

```
GET /api/v1.0/experiments
```

| Parameter | Type | Description |
| - | - | - |
| `project_id` | string | Filter by project UUID |
| `status` | string | Filter by status |
| `ticket_source` | string | Filter by ticket source (e.g., `linear`, `jira`) |
| `external_ticket_id` | string | Filter by external ticket ID |
| `created_via` | string | Filter by creation method (e.g., `mcp`, `web`, `seed`) |
| `limit` | integer | Max results to return |

**Response:** Array of experiment objects with all ExperimentOps fields.

### Get Experiment

```
GET /api/v1.0/experiments/<experiment_id>
```

**Response:** Single experiment object with full detail including `source_type`, `source_ref`, `hypothesis`, `target_metric`, `observed_delta`, `delta_confidence`, `decision`, `tags`, `project_id`, `project_name`, `launch_context`, `ab_test_config`, `ab_test_results`, and linked resources.

### Update Experiment

```
PUT /api/v1.0/experiments/<experiment_id>
```

| Field | Type | Description |
| - | - | - |
| `name` | string | Experiment name |
| `status` | string | Lifecycle state: `draft`, `running`, `complete`, `analyzing`, `shipped`, `iterating`, `rejected`, `abandoned` |
| `hypothesis` | string | Hypothesis text |
| `outcome` | string | `ship`, `iterate`, `abandon` |
| `decision` | string | Decision text with reasoning |
| `observed_delta` | float | Measured metric change |
| `delta_confidence` | string | `significant`, `inconclusive`, `not_tested` |
| `target_metric` | string | Target business metric |
| `tags` | array | Free-form tags for grouping |
| `pr_url` | string | Link to implementation PR |
| `pr_status` | string | PR status |
| `external_ticket_id` | string | Linked external ticket ID |
| `ticket_source` | string | Ticket provider |
| `ticket_url` | string | Ticket URL |

### External data

```
GET /api/v1.0/experiments/<experiment_id>/external-data
```

The A/B or production data attached to an experiment from external platforms.

### Relationships

```
GET    /api/v1.0/experiments/<experiment_id>/relationships
POST   /api/v1.0/experiments/<experiment_id>/relationships
PUT    /api/v1.0/experiments/<experiment_id>/relationships/<rel_id>
DELETE /api/v1.0/experiments/<experiment_id>/relationships/<rel_id>
POST   /api/v1.0/experiments/<experiment_id>/attach-to-history
```

Typed links between experiments (`borrows_from`, `variant_of`, `replicates`, `references`) with optional notes. `attach-to-history` files an experiment under an extracted experiment history.

### Insights

```
GET /api/v1.0/experiments/insights
GET /api/v1.0/experiments/insights/<cluster_id>/recommendations
```

Pattern clusters across a project's experiments, and the recommended resources for one cluster. Scope: `papers:read`.

***

## GitHub App

Endpoints for the Remyx GitHub App: install status, the installations your account owns, and the identity behind agents and Validate. Base path `/api/v1.0/github`. Scope: `github:read` / `github:write`. Provisioning a repo is under [Research Interests](https://docs.remyx.ai/api-reference/research.md#provision-an-agent-outrider).

### Get Install URL

```
GET /api/v1.0/github/app/install-url
```

Returns the URL to install the Remyx GitHub App on a user's account or org, with the CSRF `state` for the caller to echo.

### Get Installation

```
GET /api/v1.0/github/app/installation?repo=owner/name
```

Reports whether the App covers a repo. Always asks GitHub, so it can be polled while a person installs the App in a browser.

| Field | Description |
| - | - |
| `installed` | `true` when the App covers this repo |
| `installation_id`, `account`, `account_type`, `repository_selection` | The covering installation (`all` or `selected` repos) |
| `record` | The durable installation row: owner, Validate switch, `mine`, `claimable`, `manage_url` |
| `account_installed` | `true` when the owner account has an installation that does not cover this repo |
| `reason` | Why not, when `account_installed` is true (below) |
| `manage_url` | The App's repository-access settings page, the place to fix `repo_not_selected` |

| `reason` | Meaning | Fix |
| - | - | - |
| `repo_not_selected` | A selected-repos install that this repo is not in | Open `manage_url` and add the repo |
| `repo_unavailable` | An all-repos install that still does not cover it: GitHub has not propagated a just-created repo (a fork followed by an immediate `init` hits this), or the repo is misspelled, deleted, or invisible | Wait and retry, or check the name |
| `suspended` | Installed but suspended | Unsuspend it in GitHub settings |

Returns `503 {configured: false}` when the server has no App configured.

### Installations

```
GET   /api/v1.0/github/app/installations
PATCH /api/v1.0/github/app/installations/<installation_id>        # {validations_enabled: bool}; owner only
POST  /api/v1.0/github/app/installations/<installation_id>/claim
```

`GET` lists the installations your account owns, plus the ones your GitHub authorization can reach: unclaimed ones you may claim, and ones another Remyx account owns (read-only). An install made on github.com shows up here to be claimed. `PATCH` flips the per-installation Validate switch for every repo the installation covers; the model Validate uses is a [Validate setting](https://docs.remyx.ai/api-reference/validate.md#model), not a field here. `claim` makes you the owner of an unclaimed installation you can reach through your own GitHub authorization; it never transfers one another account owns.

### Get Installation Token

```
POST /api/v1.0/github/installation-token
```

Mints a short-lived remyx-ai\[bot] token scoped to one repo (`{repo}`), for the provisioned action key. The caller must own a merged, non-revoked provisioned action for that repo. Requires `github:write`.

### Fork a Repo

```
POST /api/v1.0/github/fork
```

Forks a repo into **your own account** (your identity, never the bot's), optionally seeding `branches` from the source network. This is what the Quickstart's set-example track uses to warm-start curated drafts. Idempotent. Requires `provisioning:write`.

| Field | Type | Description |
| - | - | - |
| `repo` | string | Repository in `owner/name` form |
| `branches` | array | Branch names to seed into the fork (optional) |

***

## Integrations

Manage connections to external tools (GitHub, Linear, Jira, Slack, Hugging Face, model providers, and more). Scope: `integrations:read` / `integrations:write`.

### List Providers

```
GET /api/v1.0/integrations/providers
```

Returns available integration providers with configuration status.

### Connect

```
GET  /api/v1.0/integrations/<provider_name>/auth-url      # OAuth providers: the authorization URL
POST /api/v1.0/integrations/<provider_name>/callback      # {code, redirect_uri}
POST /api/v1.0/integrations/<provider_name>/connect       # API-key providers: {api_key, ...} validated against the provider before it is stored
```

OpenRouter connects through an OAuth PKCE flow rather than a pasted key. Slack has its own routes under `/api/v1.0/slack/{install-url, callback, configure, installations}`.

### Connections and status

```
GET    /api/v1.0/integrations/connections
GET    /api/v1.0/integrations/<provider_name>/status
DELETE /api/v1.0/integrations/<provider_name>
```

### Get stored credentials

```
GET /api/v1.0/integrations/<provider_name>/token
```

Returns a valid token for the provider: a decrypted, auto-refreshed access token for OAuth providers, or the decrypted secret plus provider data for API-key providers. A service token may pass `user_id` to read another user's credentials; a user key reads only its own.

> [!WARNING]
>
> This route is gated by `integrations:read`, so a key with that scope can read your stored third-party credentials, not only connection status. Grant `integrations:read` only to keys you would trust with those credentials.

### Identity Resolution

```
GET /api/v1.0/integrations/identity/resolve
```

| Parameter | Type | Description |
| - | - | - |
| `source` | string | External platform (e.g., `github`, `linear`) |
| `external_id` | string | External user ID |
| `external_email` | string | External user email (alternative to external\_id) |

```
POST /api/v1.0/integrations/identity/link
```

Creates an identity link between a Remyx user and an external platform identity.

```
GET /api/v1.0/integrations/identity/links
```

Lists all identity links for the current user.


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