# REST API

URL: https://docs.ablyft.com/de/developers/reference/rest-api/

> Verwalte Experiments und lies Results programmatisch mit der ABlyft REST API aus.



Mit der REST API können Skripte und andere Systeme mit ABlyft arbeiten: Projects und Experiments auflisten, Experiments anlegen oder
ändern, starten und pausieren sowie Results auslesen. Requests und Responses verwenden JSON.

Die Base-URL ist `https://app.ablyft.com/api`. Eine vollständige, interaktive Reference aller Endpoints mit ihren Parametern findest du unter
[https://app.ablyft.com/docs/api](https://app.ablyft.com/docs/api).

## Authentication

Jeder Request braucht ein **API token** im `Authorization`-Header:

```text
Authorization: Bearer YOUR_TOKEN
Accept: application/json
```

### Ein Token erstellen

1. Öffne deine persönlichen Einstellungen und gehe zu **API Tokens**.

2. Klicke auf **Create token**.

3. Gib einen **Name** ein (wird in deiner Token-Liste angezeigt) und wähle die **Permissions**:

   | Permission       | Erlaubt                                  |
   | ---------------- | ---------------------------------------- |
   | **Read only**    | Daten lesen (`GET`-Requests)             |
   | **Read & write** | Daten lesen, anlegen, ändern und löschen |

4. Kopiere das Token aus dem Dialog. **Es wird nur einmal angezeigt.**

Die Token-Liste zeigt für jedes Token Name, Abilities, wann es zuletzt verwendet und wann es erstellt wurde. Mit **Revoke** löschst du ein
Token. Ein Token läuft nicht von selbst ab.

Ein Token funktioniert für alle Teams, in denen du Mitglied bist, mit den Permissions deiner Rolle im jeweiligen Team, siehe
[Rollen & Berechtigungen](https://docs.ablyft.com/de/guides/projects-and-teams/roles-and-permissions/). Ein Request mit fehlender Ability liefert
`403` mit der Meldung "Missing required ability: read" (oder `write`).

> **Halte Tokens geheim:** Lege ein Token niemals in Frontend-Code oder in einem öffentlichen Repository ab. Siehe [Security](https://docs.ablyft.com/de/developers/consent-and-security/security/).

## Rate limit

Requests sind pro User und Minute begrenzt. Standardmäßig kann ein User 60 Requests pro Minute senden. Wenn du das Limit überschreitest,
antwortet die API mit dem HTTP-Status `429`. Warte einen Moment und versuche es erneut. Kontaktiere den ABlyft-Support, wenn du ein höheres Limit brauchst.

## Endpoints

IDs in Pfaden sind numerisch. `{project}` ist die Project-ID, `{experiment}` die Experiment-ID.

| Resource     | Methode und Pfad                                               | Zweck                                                                                                                                   |
| ------------ | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Teams        | `GET /teams`                                                   | Teams, zu denen du gehörst                                                                                                              |
|              | `GET /teams/{team}/projects`                                   | Projects eines Teams                                                                                                                    |
| Projects     | `GET /projects/{project}`                                      | Ein Project anzeigen                                                                                                                    |
|              | `PUT/PATCH /projects/{project}`                                | `name`, `description`, `significance`, `min_conversions`, `min_runtime_days` aktualisieren                                              |
|              | `DELETE /projects/{project}`                                   | Ein Project löschen                                                                                                                     |
|              | `POST /projects/{project}/{model}/find-by-name`                | Ein Element anhand seines exakten `name` finden. `{model}` ist `experiments`, `audiences`, `pages`, `goals` oder `environments`         |
| Experiments  | `GET /projects/{project}/experiments`                          | Experiments auflisten (optional `?variations=lite`)                                                                                     |
|              | `POST /projects/{project}/experiments`                         | Ein Experiment anlegen                                                                                                                  |
|              | `GET /projects/{project}/experiments/{experiment}`             | Ein Experiment anzeigen                                                                                                                 |
|              | `PUT/PATCH /projects/{project}/experiments/{experiment}`       | Name, API Name, Beschreibung, Beispiel-URL, Traffic Allocation sowie zugeordnete Audiences, Pages, Goals und Environments aktualisieren |
|              | `DELETE /projects/{project}/experiments/{experiment}`          | Ein Experiment löschen                                                                                                                  |
|              | `POST /projects/{project}/experiments/{experiment}/clone`      | Ein Experiment klonen                                                                                                                   |
|              | `PATCH /projects/{project}/experiments/{experiment}/status`    | Den Status ändern                                                                                                                       |
|              | `PATCH /projects/{project}/experiments/{experiment}/publish`   | Das Project publishen                                                                                                                   |
| Variations   | `/projects/{project}/experiments/{experiment}/variations`      | Auflisten, anlegen, anzeigen, aktualisieren, löschen                                                                                    |
| Audiences    | `/projects/{project}/audiences`                                | Auflisten, anlegen, anzeigen, aktualisieren, löschen                                                                                    |
| Pages        | `/projects/{project}/pages`                                    | Auflisten, anlegen, anzeigen, aktualisieren, löschen                                                                                    |
| Goals        | `/projects/{project}/goals`                                    | Auflisten, anlegen, anzeigen, aktualisieren, löschen                                                                                    |
| Environments | `GET /projects/{project}/environments` und `.../{environment}` | Nur lesend                                                                                                                              |
| Results      | `GET /projects/{project}/experiments/{experiment}/results`     | Statistiken pro Goal                                                                                                                    |
|              | `GET .../results/info`                                         | Share-Token und Share-URL der Results                                                                                                   |
|              | `GET .../results/goal/{goal}`                                  | Event-Serie eines Goals                                                                                                                 |
|              | `GET .../results/goal/{goal}/download`                         | Dasselbe als CSV-Datei                                                                                                                  |

Für die Standard-Resources (Variations, Audiences, Pages, Goals) gelten die üblichen Methoden: `GET` zum Auflisten oder Anzeigen, `POST` zum
Anlegen, `PUT`/`PATCH` zum Aktualisieren und `DELETE` zum Löschen. Anlegen, Aktualisieren und Löschen erfordert ein **Read & write**-Token und
die Permission deiner Rolle.

Es gibt keinen Endpoint, der alle Projects auf einmal auflistet. Lies zuerst deine Teams und dann die Projects jedes Teams.

### Den Status eines Experiments ändern

Sende eines von `draft`, `preview`, `running`, `pause` oder `archive` als `status`:

```bash
curl -X PATCH https://app.ablyft.com/api/projects/12345678/experiments/23456789/status \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"status": "running"}'
```

Die Response enthält das aktualisierte Experiment. Stelle sicher, dass das Experiment mindestens eine Variation, Page und ein Goal hat, bevor du es startest, wie in der App, siehe [Before you can preview or start](https://docs.ablyft.com/de/guides/experiments/start-pause-stop/#before-you-can-preview-or-start).

### Die Response reduzieren

Hänge bei Experiment-Requests `?fields=id,name,status` an, um nur diese Felder zu erhalten.

## Beispiele

### Teams und Projects auflisten

```bash
curl https://app.ablyft.com/api/teams \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Accept: application/json"
```

```json
[
  { "id": 1234, "name": "My company", "created_at": "2025-01-15T09:30:00.000000Z", "updated_at": "2025-06-01T12:00:00.000000Z" }
]
```

```bash
curl https://app.ablyft.com/api/teams/1234/projects \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Accept: application/json"
```

Die Response listet jedes Project mit Feldern wie `id`, `name`, `storage`, `snippet_revision` und `snippet_version`.

### Experiments auflisten

```bash
curl "https://app.ablyft.com/api/projects/12345678/experiments?fields=id,name,status" \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Accept: application/json"
```

```json
[
  { "id": 23456789, "name": "Product page: bigger buy button", "status": "running" }
]
```

Ohne `fields` enthält jedes Experiment zusätzlich `description`, `example_url`, `traffic_allocation`, `audiences_match_type`,
`tags`, `js`, `reset_js`, `css` und die `variations`.

### Results lesen

```bash
curl https://app.ablyft.com/api/projects/12345678/experiments/23456789/results \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Accept: application/json"
```

Die Response ist eine Liste mit einem Eintrag pro Goal (hier verkürzt). `variationStatistics` ist nach Variation-ID geschlüsselt:

```json
[
  {
    "id": 34567890,
    "type": "custom",
    "name": "Newsletter signup",
    "api_name": "newsletter-signup",
    "variationStatistics": {
      "87654321": { "id": 87654321 }
    }
  }
]
```

Das Statistik-Objekt jeder Variation enthält Participants, Conversions, Werte und die Signifikanzwerte, die die Results-Seite
anzeigt. Die Felder sind in der interaktiven Reference aufgeführt. Die optionalen Query-Parameter `startDate`,
`endDate` und `deviceTypes` filtern die Results. Hat ein Experiment noch keine Results, antwortet die API mit `404` und
"No result found for this experiment".

## Fehler

| Status | Bedeutung                                                              |
| ------ | ---------------------------------------------------------------------- |
| `401`  | Fehlendes oder ungültiges Token                                        |
| `403`  | Dem Token fehlt die Ability, oder deine Rolle erlaubt die Aktion nicht |
| `404`  | Das Element existiert nicht, oder du kannst es nicht sehen             |
| `422`  | Validierung fehlgeschlagen. Die Response listet die Felder auf         |
| `429`  | Rate limit erreicht                                                    |

## Nächste Schritte

- [MCP server](https://docs.ablyft.com/de/developers/reference/mcp-server/): Lass einen KI-Assistenten ABlyft für dich nutzen.
- [Security](https://docs.ablyft.com/de/developers/consent-and-security/security/): Halte deine Tokens sicher.

