# REST-API

> Erstelle Links, Smart Links, Formulare und Multilink-Seiten aus deinem eigenen Code und lies ihre Statistiken, mit denselben Regeln wie in der Walink-App.

Mit der Walink-API erledigt ein Skript, ein Backend oder jedes No-Code-Tool, das HTTP-Anfragen sendet, was du sonst in der App machst. Jede Anfrage läuft durch die Regeln der App. Adressen, Kontingent und Eigentum werden also genauso geprüft. Jedes Erstellen ergibt einen Entwurf, außer bei einem kostenlosen Link. So geht nichts versehentlich online.

Diese Seite bringt dich bis zum ersten Aufruf. Jeder Endpunkt und jedes Feld steht in der [vollständigen API-Referenz](https://api.walink.com/docs). Dort gibt es auch eine Konsole, um Anfragen auszuprobieren.

## Was du automatisieren kannst

| Ressource                           | Was die API macht                                                                                          |
| ----------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| Premium-Links (`/v1/links`)         | Auflisten, Entwürfe erstellen, bearbeiten, veröffentlichen, zum Entwurf machen, löschen, QR-Code gestalten |
| Smart Links (`/v1/smart-links`)     | Dasselbe, mit Zielen und Routing                                                                           |
| Formulare (`/v1/forms`)             | Dasselbe, dazu die Antworten, die Leute gesendet haben                                                     |
| Multilink-Seiten (`/v1/multilinks`) | Dasselbe                                                                                                   |
| Kostenlose Links (`/v1/free-links`) | Auflisten, erstellen, lesen, löschen                                                                       |
| Statistiken (`/v1/analytics`)       | Zahlen und Aufschlüsselungen nach Land, Quelle, Gerät und mehr                                             |
| Konto (`/v1/account`)               | Profil, genutztes Kontingent, vorhandene kostenlose Links                                                  |

Jedes Walink-Konto kann die API nutzen. Entwürfe sind kostenlos. Das Veröffentlichen verbraucht das Kontingent deines Abos, und Statistiken brauchen ein Abo, wie in der App.

## Ein Token erstellen

1. [Melde dich bei Walink an](https://app.walink.com/login?lang=de), öffne das Kontomenü (der runde Button oben rechts) und wähle **Developers**.
2. Wähle unter **API Tokens** den Punkt **Create token** (Token erstellen).
3. Gib ihm einen **Name**, etwa „Reporting-Skript“, und leg bei **Expires after** fest, wann es abläuft: **30 days**, **90 days**, **1 year** (der Standard) oder **No expiration** (kein Ablauf).
4. Hake unter **Scopes** (Berechtigungen) nur an, was das Token braucht. **Quick presets** füllt **Read only** (nur lesen) oder **Full access** (voller Zugriff) aus. Scopes lassen sich später nicht ändern.
5. Wähle **Create token**. Das Fenster **Save your token** zeigt es ein einziges Mal: Kopiere es an einen sicheren Ort, etwa in einen Passwortmanager, und wähle dann **I've saved it** (ich habe es gespeichert).

Tokens beginnen mit `wlk_live_`, und ein Konto kann 25 aktive Tokens haben. In der Token-Tabelle gibt dir **Rotate** ein neues Token mit demselben Namen und denselben Scopes, während das alte noch 7 Tage funktioniert. **Revoke** (widerrufen) stoppt ein Token endgültig, innerhalb von 30 Sekunden.

### Scopes

`write` schließt `read` ein. Nichts schließt `publish`, `delete` oder `responses:read` ein: Jeder davon wird einzeln vergeben, und keiner ist standardmäßig an.

| Scope                     | Erlaubt                                                                                           |
| ------------------------- | ------------------------------------------------------------------------------------------------- |
| `links:read`              | Premium-Links, Smart Links und kostenlose Links lesen                                             |
| `links:write`             | Entwürfe erstellen und bearbeiten                                                                 |
| `links:publish`           | Veröffentlichen, zum Entwurf machen, alles Veröffentlichte bearbeiten, kostenlose Links erstellen |
| `links:delete`            | Löschen                                                                                           |
| `forms:*`, `multilinks:*` | Dieselben vier für Formulare und Multilink-Seiten                                                 |
| `account:read`            | Profil, Kontingent und Nutzung                                                                    |
| `analytics:read`          | Statistiken                                                                                       |
| `responses:read`          | Formularantworten. Darin stehen persönliche Daten, die Leute dir gesendet haben                   |

`analytics:read` und `multilinks:read` zeigen auch die Namen deiner veröffentlichten Links, Smart Links und Formulare, selbst ohne deren eigenen Lese-Scope.

## Deine erste Anfrage

Die Basis-URL ist `https://api.walink.com/v1`. Sende das Token als `Authorization: Bearer <token>` und den Inhalt von Anfragen als JSON. Die Beispiele lesen das Token aus der Umgebungsvariable `WALINK_API_TOKEN`. So bleibt es aus deinem Code heraus.

Deine Premium-Links auflisten (braucht `links:read`):

```sh
curl https://api.walink.com/v1/links \
  -H "Authorization: Bearer $WALINK_API_TOKEN"
```

```json
{
	"data": [
		{
			"id": "lnk_3f2a9c1e-7b4d-4e8a-9f10-2c6d8e4b1a77",
			"title": "Tienda Luna orders",
			"handle": "tienda-luna",
			"plan": "chat",
			"status": "published",
			"url": "https://wa.link/tienda-luna",
			"created_at": "2026-11-05T14:32:07.000Z",
			"updated_at": "2026-11-05T14:32:07.000Z"
		}
	],
	"has_more": false,
	"next_cursor": null
}
```

Listen beginnen mit dem Neuesten. Dazu gibt es `limit` (standardmäßig 25, höchstens 100) und `cursor`: Übergib `next_cursor`, um die nächste Seite zu bekommen.

### Einen Entwurf erstellen

Ein Erstellen ergibt immer einen Entwurf (braucht `links:write`). Dieser hier öffnet einen Chat mit einer US-Nummer:

```sh
curl -X POST https://api.walink.com/v1/links \
  -H "Authorization: Bearer $WALINK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: tienda-luna-promo-1" \
  -d '{
    "handle": "tienda-luna-promo",
    "plan": "chat",
    "title": "Tienda Luna promo",
    "phone": "4155550123",
    "country_code": "1",
    "country_alpha": "US",
    "message": "Hello Tienda Luna, I saw your promo"
  }'
```

Die Antwort ist `201` mit dem vollständigen Datensatz, seiner `id` und `"status": "draft"`.

- `handle` ist die Adresse nach `wa.link/`. Die Adresse lässt sich nicht mehr ändern, sobald der Link erstellt ist, und ein Entwurf reserviert sie nicht: Das erste Konto, das unter ihr veröffentlicht, bekommt sie.
- `plan` ist der Linktyp: `chat`, `catalog`, `channel` oder `group`.
- `Idempotency-Key` macht eine Wiederholung 24 Stunden lang sicher: Derselbe Schlüssel mit demselben Inhalt liefert die erste Antwort statt eines zweiten Entwurfs.

## Veröffentlichen

Das Veröffentlichen ist ein eigener Aufruf und braucht `links:publish`:

```sh
curl -X POST https://api.walink.com/v1/links/lnk_3f2a9c1e-7b4d-4e8a-9f10-2c6d8e4b1a77/publish \
  -H "Authorization: Bearer $WALINK_API_TOKEN"
```

Wie **Publish** in der App verbraucht es eine Einheit deines Premium-Links-Kontingents ($9 USD pro Jahr pro Link). Ohne freie Einheit ist die Antwort `402 pool_exhausted`, mit den Zahlen in `details`. Kontingent fügst du auf der Seite [Billing](https://app.walink.com/billing?lang=de) der App hinzu ([so funktioniert die Abrechnung](https://walink.com/de/docs/billing)).

- `POST .../publish-check` ist ein Probelauf: was das Veröffentlichen noch blockiert und wie viel Kontingent es verbrauchen würde.
- `POST .../unpublish` nimmt den Link offline und gibt seine Einheit frei. Seine Adresse funktioniert nicht mehr, auch nicht auf gedruckten QR-Codes, und ein anderes Konto kann sie sich dann sichern.
- `PATCH /v1/links/{id}` ändert nur die Felder, die du sendest. Bei einem veröffentlichten Link ist die Änderung sofort online. Dafür brauchst du deshalb ebenfalls `links:publish`.

Smart Links, Formulare und Multilink-Seiten folgen denselben Schritten unter ihren eigenen Pfaden. Smart Links nutzen die `links`-Scopes.

## Kostenlose Links über die API

`/v1/free-links` erstellt die kostenlosen Links, von denen jedes Konto bis zu 5 haben kann. Diese Links funktionieren anders:

- Ein kostenloser Link ist online, sobald er erstellt ist, und nie ein Entwurf. Deshalb braucht das Erstellen `links:publish`, nicht `links:write`.
- Walink wählt seine zufällige Adresse. Du sendest eine Telefonnummer oder einen WhatsApp-Benutzernamen, optional eine Nachricht und optional einen privaten `title`, der sich später nicht ändern lässt.
- Er lässt sich auflisten, lesen und löschen, aber nie bearbeiten. Seine ID beginnt mit `fln_`, und `/v1/links` zeigt ihn nie.
- Um ihn zu bearbeiten oder seine Statistiken zu sehen, brauchst du ein Upgrade auf Premium in der App. Dabei ändert sich seine ID zu `lnk_`.

Sind es schon 5, antwortet ein Erstellen mit `409 free_link_limit_reached`. Löschst du einen, wird sein Platz frei. Mehr dazu unter [Kostenlose Links](https://walink.com/de/docs/free-links).

## Fehler und Ratenlimits

Jeder Fehler hat denselben Aufbau:

```json
{
	"error": {
		"code": "insufficient_scope",
		"message": "This token needs the links:publish scope.",
		"param": null,
		"doc_url": "https://api.walink.com/docs#description/errors",
		"request_id": "req_4f1c9a0b7d2e4c8f9a1b3c5d7e9f0a2b",
		"details": { "required": ["links:publish"] }
	}
}
```

| Status | Häufige Codes                                                | Bedeutung                                                   |
| ------ | ------------------------------------------------------------ | ----------------------------------------------------------- |
| 401    | `invalid_token`                                              | Token fehlt, ist abgelaufen oder widerrufen                 |
| 402    | `pool_exhausted`, `past_due_locked`, `subscription_required` | Kontingent oder Abrechnung, in der App zu beheben           |
| 403    | `insufficient_scope`                                         | `details.required` nennt den Scope                          |
| 404    | `not_found`                                                  | Auch bei IDs anderer Konten                                 |
| 409    | `handle_taken`, `free_link_limit_reached`                    | Die Adresse ist vergeben, oder eine Grenze ist erreicht     |
| 422    | `validation_failed`, `handle_immutable`                      | Ungültige Anfrage. `details.fields` listet die Probleme auf |
| 429    | `rate_limited`                                               | Warte `Retry-After` Sekunden                                |

| Anfragen                                           | Limit                    |
| -------------------------------------------------- | ------------------------ |
| Lesen                                              | 120 pro Minute pro Token |
| Erstellen, Bearbeiten, Veröffentlichen und Löschen | 30 pro Minute pro Konto  |
| Statistiken                                        | 10 pro Minute pro Konto  |
| Adressprüfungen                                    | 30 pro Minute pro Konto  |

Die Limits sind Richtwerte, und ein aufgebrauchtes Kontingent ist nie ein `429`. Über die API kann ein Konto bis zu 500 Entwürfe pro Produkt haben. Jede Antwort trägt einen `Request-Id`-Header: Nenn ihn, wenn du dich an den Support wendest.

## Vollständige Referenz

- [API-Referenz](https://api.walink.com/docs): jeder Endpunkt und jedes Feld, mit Konsole.
- [OpenAPI-3.1-Dokument](https://api.walink.com/openapi.json) und [Enums und Limits](https://api.walink.com/v1/reference), ohne Token.
- [llms.txt](https://api.walink.com/llms.txt): die Regeln der API, für KI-Tools.

Dasselbe Token verbindet auch KI-Assistenten: siehe [KI-Assistenten verbinden](https://walink.com/de/docs/mcp).
