# API REST

> Créez des liens, des Smart Links, des formulaires et des pages Multilink depuis votre code, et lisez leurs statistiques, avec les règles de l’application.

L’API Walink permet à un script, à un backend ou à tout outil no-code capable d’envoyer des requêtes HTTP de faire ce que vous faites dans l’application. Chaque requête passe par les règles de l’application : les adresses, le quota et la propriété sont donc vérifiés de la même façon. Chaque création donne un brouillon, sauf pour un lien gratuit : rien n’est donc mis en ligne par accident.

Cette page vous amène jusqu’à un premier appel. Tous les points de terminaison et tous les champs figurent dans la [référence complète de l’API](https://api.walink.com/docs), qui comporte aussi une console pour essayer des requêtes.

## Ce que vous pouvez automatiser

| Ressource                          | Ce que fait l’API                                                                               |
| ---------------------------------- | ----------------------------------------------------------------------------------------------- |
| Liens Premium (`/v1/links`)        | Lister, créer des brouillons, modifier, publier, dépublier, supprimer, personnaliser le code QR |
| Smart Links (`/v1/smart-links`)    | La même chose, avec les destinations et le routage                                              |
| Formulaires (`/v1/forms`)          | La même chose, plus les réponses que les gens ont envoyées                                      |
| Pages Multilink (`/v1/multilinks`) | La même chose                                                                                   |
| Liens gratuits (`/v1/free-links`)  | Lister, créer, lire, supprimer                                                                  |
| Statistiques (`/v1/analytics`)     | Chiffres et répartitions par pays, source, appareil et plus encore                              |
| Compte (`/v1/account`)             | Profil, quota utilisé, liens gratuits détenus                                                   |

N’importe quel compte Walink peut utiliser l’API. Les brouillons sont gratuits. Publier utilise le quota de votre abonnement et les statistiques demandent un abonnement, comme dans l’application.

## Créer un jeton

1. [Connectez-vous à Walink](https://app.walink.com/login?lang=fr), ouvrez le menu du compte (le bouton rond en haut à droite) et sélectionnez **Developers** (développeurs).
2. Sous **API Tokens** (jetons d’API), sélectionnez **Create token** (créer un jeton).
3. Donnez-lui un **Name** (nom), comme « Script de rapports », et choisissez quand il expire sous **Expires after** (expire après) : **30 days**, **90 days**, **1 year** (la valeur par défaut) ou **No expiration** (sans expiration).
4. Sous **Scopes** (autorisations), ne cochez que ce dont le jeton a besoin. **Quick presets** (préréglages rapides) remplit **Read only** (lecture seule) ou **Full access** (accès complet). Les autorisations ne peuvent pas être modifiées ensuite.
5. Sélectionnez **Create token**. La fenêtre **Save your token** (enregistrez votre jeton) ne l’affiche qu’une fois : copiez-le dans un endroit sûr, comme un gestionnaire de mots de passe, puis sélectionnez **I’ve saved it** (je l’ai enregistré).

Les jetons commencent par `wlk_live_`, et un compte peut avoir 25 jetons actifs. Dans le tableau des jetons, **Rotate** (renouveler) vous donne un nouveau jeton avec le même nom et les mêmes autorisations, tandis que l’ancien continue de fonctionner pendant 7 jours. **Revoke** (révoquer) arrête définitivement un jeton, en moins de 30 secondes.

### Autorisations

`write` inclut `read`. Rien n’inclut `publish`, `delete` ni `responses:read` : chacune s’accorde séparément, et aucune n’est activée par défaut.

| Autorisation              | Permet de                                                                                             |
| ------------------------- | ----------------------------------------------------------------------------------------------------- |
| `links:read`              | Lire les Liens Premium, les Smart Links et les liens gratuits                                         |
| `links:write`             | Créer et modifier des brouillons                                                                      |
| `links:publish`           | Publier, dépublier, modifier tout ce qui est publié, créer des liens gratuits                         |
| `links:delete`            | Supprimer                                                                                             |
| `forms:*`, `multilinks:*` | Les quatre mêmes pour les formulaires et les pages Multilink                                          |
| `account:read`            | Profil, quota et utilisation                                                                          |
| `analytics:read`          | Statistiques                                                                                          |
| `responses:read`          | Les réponses aux formulaires, qui contiennent des données personnelles que les gens vous ont envoyées |

`analytics:read` et `multilinks:read` montrent aussi les noms de vos liens, Smart Links et formulaires publiés, même sans leur propre autorisation de lecture.

## Votre première requête

L’URL de base est `https://api.walink.com/v1`. Envoyez le jeton sous la forme `Authorization: Bearer <token>` et les corps de requête en JSON. Les exemples lisent le jeton dans une variable d’environnement `WALINK_API_TOKEN` : il reste ainsi en dehors de votre code.

Lister vos Liens Premium (demande `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
}
```

Les listes vont du plus récent au plus ancien. Elles acceptent `limit` (25 par défaut, 100 au maximum) et `cursor` : transmettez `next_cursor` pour obtenir la page suivante.

### Créer un brouillon

Une création donne toujours un brouillon (demande `links:write`). Celui-ci ouvre une discussion avec un numéro américain :

```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"
  }'
```

La réponse est un `201` avec l’enregistrement complet, son `id` et `"status": "draft"`.

- `handle` est l’adresse qui suit `wa.link/`. Elle ne peut plus être modifiée une fois le lien créé, et un brouillon ne la réserve pas : le premier compte qui publie avec elle l’obtient.
- `plan` est le type de lien : `chat`, `catalog`, `channel` ou `group`.
- `Idempotency-Key` rend une nouvelle tentative sans risque pendant 24 heures : la même clé et le même corps renvoient la première réponse au lieu de créer un second brouillon.

## Publier

La publication est un appel à part, et elle demande `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"
```

Comme **Publish** (publier) dans l’application, elle utilise une unité de votre quota de Liens Premium ($9 USD par an et par lien). Sans unité libre, la réponse est `402 pool_exhausted`, avec les chiffres dans `details`. Ajoutez du quota sur la page [Billing](https://app.walink.com/billing?lang=fr) de l’application ([fonctionnement de la facturation](https://walink.com/fr/docs/billing)).

- `POST .../publish-check` est un essai à blanc : ce qui bloque encore la publication et la quantité de quota qu’elle utiliserait.
- `POST .../unpublish` met le lien hors ligne et libère son unité. Son adresse cesse de fonctionner, codes QR imprimés compris, et un autre compte peut alors l’obtenir.
- `PATCH /v1/links/{id}` ne change que les champs que vous envoyez. Sur un lien publié, le changement est en ligne aussitôt : il demande donc aussi `links:publish`.

Les Smart Links, les formulaires et les pages Multilink suivent les mêmes étapes, sous leurs propres chemins. Les Smart Links utilisent les autorisations `links`.

## Les liens gratuits dans l’API

`/v1/free-links` crée les liens gratuits que chaque compte peut détenir, jusqu’à 5. Ils fonctionnent différemment :

- Un lien gratuit est en ligne dès sa création, jamais en brouillon. C’est pourquoi en créer un demande `links:publish`, pas `links:write`.
- Walink choisit son adresse aléatoire. Vous envoyez un numéro de téléphone ou un nom d’utilisateur WhatsApp, un message facultatif et un `title` privé facultatif, qui ne peut pas être modifié ensuite.
- Il peut être listé, lu et supprimé, jamais modifié. Son `id` commence par `fln_`, et `/v1/links` ne le montre jamais.
- Le modifier ou voir ses statistiques demande de le passer à Premium dans l’application, ce qui change son `id` en `lnk_`.

Avec 5 liens déjà présents, une création répond `409 free_link_limit_reached`, et en supprimer un libère son emplacement. Pour en savoir plus, voir les [liens gratuits](https://walink.com/fr/docs/free-links).

## Erreurs et limites de débit

Toutes les erreurs ont la même forme :

```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"] }
	}
}
```

| Statut | Codes courants                                               | Signification                                             |
| ------ | ------------------------------------------------------------ | --------------------------------------------------------- |
| 401    | `invalid_token`                                              | Jeton manquant, expiré ou révoqué                         |
| 402    | `pool_exhausted`, `past_due_locked`, `subscription_required` | Quota ou facturation, à régler dans l’application         |
| 403    | `insufficient_scope`                                         | `details.required` nomme l’autorisation                   |
| 404    | `not_found`                                                  | Aussi pour les `id` d’autres comptes                      |
| 409    | `handle_taken`, `free_link_limit_reached`                    | L’adresse est prise, ou une limite est atteinte           |
| 422    | `validation_failed`, `handle_immutable`                      | Requête invalide. `details.fields` détaille les problèmes |
| 429    | `rate_limited`                                               | Attendez `Retry-After` secondes                           |

| Requêtes                                               | Limite                      |
| ------------------------------------------------------ | --------------------------- |
| Lectures                                               | 120 par minute et par jeton |
| Créations, modifications, publications et suppressions | 30 par minute et par compte |
| Statistiques                                           | 10 par minute et par compte |
| Vérifications d’adresse                                | 30 par minute et par compte |

Les limites sont approximatives, et un quota épuisé ne donne jamais un `429`. Par l’API, un compte peut avoir jusqu’à 500 brouillons par produit. Chaque réponse porte un en-tête `Request-Id` : citez-le quand vous contactez l’assistance.

## Référence complète

- [Référence de l’API](https://api.walink.com/docs) : tous les points de terminaison et tous les champs, avec une console.
- [Document OpenAPI 3.1](https://api.walink.com/openapi.json) et [énumérations et limites](https://api.walink.com/v1/reference), sans jeton.
- [llms.txt](https://api.walink.com/llms.txt) : les règles de l’API, pour les outils d’IA.

Le même jeton connecte aussi les assistants IA : voir [Connecter des assistants IA](https://walink.com/fr/docs/mcp).
