# API-Übersicht

Authentifizierung, Endpunkt, Fehler und Rate-Limits.

## API-Übersicht

Ein einzelner JSON-RPC-Endpunkt, der mit API-Tokens authentifiziert wird. Methoden werden direkt beim Namen aufgerufen.

> ℹ️ **Kein Code nötig?**
> <p>
>     Die <a href="/de/guides/overview">Anleitungen</a> richten Formstep Klick für Klick in Zapier ein, ohne dass du selbst die API aufrufst.
>   </p>

<h2 id="endpoint">Endpunkt</h2>
<p>
  Alle Anfragen gehen über <code>POST</code> an eine einzige URL. Übergib den Methodennamen und die Parameter als JSON.
</p>

```
POST https://api.formstep.io/api/v1
```

<h2 id="auth">Authentifizierung</h2>
<p>
  Übergib deinen API-Token als Bearer-Token im <code>Authorization</code>-Header. Tokens sind einem Workspace zugeordnet — erstelle sie
  unter <strong>OAuth und API-Keys</strong> in der Seitenleiste.
</p>

  
    
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{"method": "forms.list", "params": {}}'
```

  
  
    
```
const res = await fetch('https://api.formstep.io/api/v1', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.FORMSTEP_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ method: 'forms.list', params: {} }),
})
const data = await res.json()
```

  
  
    
```
import os, requests
res = requests.post(
    "https://api.formstep.io/api/v1",
    headers={"Authorization": f"Bearer {os.environ['FORMSTEP_TOKEN']}"},
    json={"method": "forms.list", "params": {}},
)
data = res.json()
```

  

> ⚠️ **Tokens nur serverseitig verwenden**
> <p>Bette Tokens niemals in Browser-Code ein. Verwende für clientseitige Aufrufe einen Backend-Proxy.</p>

<h2 id="request-format">Anfrage-Format</h2>
<p>Jede Anfrage ist ein JSON-Objekt mit zwei Feldern:</p>

```
{
  "method": "forms.list",
  "params": {
    "workspaceId": "abc123..."
  }
}
```

<h2 id="response-format">Antwort-Format</h2>
<p>
  Jede Antwort ist ein JSON-Objekt mit einem <code>ok</code>-Feld. Bei Erfolg:
</p>

```
{
  "ok": true,
  "data": { ... }
}
```

<h2 id="errors">Fehler</h2>
<p>
  Bei einem Fehler ist <code>ok</code> gleich <code>false</code>, und ein <code>error</code>-Objekt enthält einen maschinenlesbaren Code und
  eine menschenlesbare Meldung:
</p>

```
{
  "ok": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Field 'name' is required."
  }
}
```

<p>Häufige Fehlercodes:</p>
<ul>
  <li>
    <code>VALIDATION_ERROR</code> (400) — ungültige oder fehlende Parameter
  </li>
  <li>
    <code>UNAUTHORIZED</code> (401) — fehlender oder ungültiger API-Token
  </li>
  <li>
    <code>UPGRADE_REQUIRED</code> (402) — die Funktion erfordert ein höheres Abonnement-Tier
  </li>
  <li>
    <code>FORBIDDEN</code> (403) — Token hat keinen Zugriff auf die Ressource
  </li>
  <li>
    <code>CONFLICT</code> (409) — Ressourcen-Zustandskonflikt, z. B. ein doppelter Name
  </li>
  <li>
    <code>NOT_FOUND</code> (404) — Ressource existiert nicht
  </li>
  <li>
    <code>METHOD_NOT_FOUND</code> (404) — unbekannter Methodenname
  </li>
  <li>
    <code>RATE_LIMITED</code> (429) — zu viele Anfragen
  </li>
  <li>
    <code>INTERNAL_ERROR</code> (500) — unerwarteter Serverfehler
  </li>
</ul>

<h2 id="rate-limits">Rate-Limits</h2>
<p>
  API-Anfragen sind auf <strong>120 Anfragen pro Minute</strong> pro Token begrenzt. Bei Überschreitung des Limits wird{' '}
  <code>429 Too Many Requests</code> zurückgegeben.
</p>

<h2 id="next-steps">Nächste Schritte</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [API-Methoden](/de/developers/rest-api) — Vollständige Liste der verfügbaren Methoden
  - [API-Tokens](/de/developers/api-tokens) — Tokens erstellen und verwalten
  - [Webhooks-Referenz](/de/developers/webhooks-reference) — Payload-Schema und Signierung
  - [MCP-Server](/de/developers/mcp-server) — Formstep aus KI-Agenten heraus verwenden
</div>
