# REST API

> Buat link, Smart Links, formulir, dan halaman Multilink dari kode Anda sendiri, dan baca analitiknya, dengan aturan yang sama seperti aplikasi Walink.

Dengan API Walink, sebuah skrip, backend, atau alat no-code apa pun yang mengirim permintaan HTTP bisa melakukan apa yang Anda lakukan di aplikasi. Setiap permintaan melewati aturan aplikasi itu sendiri, jadi alamat, kuota, dan kepemilikan diperiksa dengan cara yang sama, dan setiap pembuatan menghasilkan draf, kecuali link gratis, jadi tidak ada yang aktif tanpa sengaja.

Halaman ini mengantar Anda sampai panggilan pertama. Setiap endpoint dan kolom ada di [referensi API lengkap](https://api.walink.com/docs), yang juga punya konsol untuk mencoba permintaan.

## Yang bisa Anda otomatiskan

| Resource                             | Yang dilakukan API                                                                                             |
| ------------------------------------ | -------------------------------------------------------------------------------------------------------------- |
| Link Premium (`/v1/links`)           | Menampilkan daftar, membuat draf, mengedit, memublikasikan, membatalkan publikasi, menghapus, mengatur gaya QR |
| Smart Links (`/v1/smart-links`)      | Sama, dengan tujuan dan routing                                                                                |
| Formulir (`/v1/forms`)               | Sama, ditambah respons yang dikirim orang                                                                      |
| Halaman Multilink (`/v1/multilinks`) | Sama                                                                                                           |
| Link gratis (`/v1/free-links`)       | Menampilkan daftar, membuat, membaca, menghapus                                                                |
| Analitik (`/v1/analytics`)           | Angka dan rincian menurut negara, sumber, perangkat, dan lainnya                                               |
| Akun (`/v1/account`)                 | Profil, kuota yang terpakai, link gratis yang dimiliki                                                         |

Akun Walink mana pun bisa memakai API. Draf gratis. Memublikasikan memakai kuota langganan Anda dan analitik memerlukan langganan, seperti di aplikasi.

## Buat token

1. [Masuk ke Walink](https://app.walink.com/login?lang=id), buka menu akun (tombol bulat di kanan atas) dan pilih **Developers**.
2. Di bawah **API Tokens**, pilih **Create token** (buat token).
3. Beri **Name** (nama), seperti "Skrip laporan", dan pilih kapan token itu **Expires after** (kedaluwarsa setelah): **30 days**, **90 days**, **1 year** (default), atau **No expiration** (tanpa kedaluwarsa).
4. Di bawah **Scopes** (cakupan), centang hanya yang dibutuhkan token. **Quick presets** (preset cepat) mengisi **Read only** (hanya baca) atau **Full access** (akses penuh). Scope tidak bisa diubah nanti.
5. Pilih **Create token**. Jendela **Save your token** (simpan token Anda) menampilkannya satu kali: salin ke tempat yang aman, seperti pengelola kata sandi, lalu pilih **I've saved it** (sudah saya simpan).

Token diawali `wlk_live_`, dan satu akun bisa punya 25 token aktif. Di tabel token, **Rotate** memberi Anda token baru dengan nama dan scope yang sama, sementara token lama tetap berfungsi selama 7 hari. **Revoke** menghentikan token untuk selamanya, dalam 30 detik.

### Scope

`write` mencakup `read`. Tidak ada yang mencakup `publish`, `delete`, atau `responses:read`: masing-masing diberikan tersendiri, dan tidak ada yang aktif secara default.

| Scope                     | Mengizinkan                                                                                            |
| ------------------------- | ------------------------------------------------------------------------------------------------------ |
| `links:read`              | Membaca Link Premium, Smart Links, dan link gratis                                                     |
| `links:write`             | Membuat dan mengedit draf                                                                              |
| `links:publish`           | Memublikasikan, membatalkan publikasi, mengedit apa pun yang sudah dipublikasikan, membuat link gratis |
| `links:delete`            | Menghapus                                                                                              |
| `forms:*`, `multilinks:*` | Empat scope yang sama untuk formulir dan halaman Multilink                                             |
| `account:read`            | Profil, kuota, dan pemakaian                                                                           |
| `analytics:read`          | Analitik                                                                                               |
| `responses:read`          | Respons formulir, yang memuat data pribadi yang dikirim orang kepada Anda                              |

`analytics:read` dan `multilinks:read` juga menampilkan nama link, Smart Link, dan formulir Anda yang dipublikasikan, bahkan tanpa scope baca masing-masing.

## Permintaan pertama Anda

URL dasarnya adalah `https://api.walink.com/v1`. Kirim token sebagai `Authorization: Bearer <token>` dan isi permintaan sebagai JSON. Contoh-contoh di sini membaca token dari variabel lingkungan `WALINK_API_TOKEN`, jadi token tidak tertulis di kode Anda.

Tampilkan daftar Link Premium Anda (memerlukan `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
}
```

Daftar diurutkan dari yang terbaru. Daftar menerima `limit` (default 25, maksimal 100) dan `cursor`: kirim `next_cursor` untuk mendapatkan halaman berikutnya.

### Buat draf

Pembuatan selalu menghasilkan draf (memerlukan `links:write`). Yang ini membuka chat dengan nomor AS:

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

Jawabannya adalah `201` dengan data lengkapnya, `id`-nya, dan `"status": "draft"`.

- `handle` adalah alamat setelah `wa.link/`. Alamat tidak bisa diubah setelah link dibuat, dan draf tidak memesannya: akun pertama yang memublikasikan di alamat itu yang mendapatkannya.
- `plan` adalah jenis link: `chat`, `catalog`, `channel`, atau `group`.
- `Idempotency-Key` membuat percobaan ulang aman selama 24 jam: kunci dan isi yang sama mengembalikan jawaban pertama, bukan draf kedua.

## Publikasikan

Publikasi adalah panggilan tersendiri, dan memerlukan `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"
```

Seperti **Publish** di aplikasi, panggilan ini memakai satu unit dari kuota Link Premium Anda ($9 USD per tahun per link). Tanpa unit yang bebas, jawabannya adalah `402 pool_exhausted`, dengan angkanya di `details`. Tambah kuota di halaman [Billing](https://app.walink.com/billing?lang=id) aplikasi ([cara kerja penagihan](https://walink.com/id/docs/billing)).

- `POST .../publish-check` adalah uji coba tanpa perubahan: apa yang masih menghalangi publikasi dan berapa kuota yang akan dipakainya.
- `POST .../unpublish` menonaktifkan link dan membebaskan unitnya. Alamatnya berhenti berfungsi, termasuk kode QR yang sudah dicetak, dan akun lain kemudian bisa mengambilnya.
- `PATCH /v1/links/{id}` hanya mengubah kolom yang Anda kirim. Pada link yang dipublikasikan perubahan langsung aktif, jadi juga memerlukan `links:publish`.

Smart Links, formulir, dan halaman Multilink mengikuti langkah yang sama di path masing-masing. Smart Links memakai scope `links`.

## Link gratis di API

`/v1/free-links` membuat link gratis yang bisa dimiliki setiap akun, hingga 5. Cara kerjanya berbeda:

- Link gratis langsung aktif begitu dibuat, tidak pernah berupa draf. Karena itulah membuatnya memerlukan `links:publish`, bukan `links:write`.
- Walink yang memilih alamat acaknya. Anda mengirim nomor telepon atau nama pengguna WhatsApp, pesan opsional, dan `title` pribadi opsional, yang tidak bisa diubah nanti.
- Link ini bisa ditampilkan dalam daftar, dibaca, dan dihapus, tidak pernah diedit. Id-nya diawali `fln_`, dan `/v1/links` tidak pernah menampilkannya.
- Mengeditnya atau melihat analitiknya memerlukan upgrade ke Premium di aplikasi, yang mengubah id-nya menjadi `lnk_`.

Jika sudah ada 5, pembuatan dijawab dengan `409 free_link_limit_reached`, dan menghapus satu link membebaskan slotnya. Selengkapnya di [link gratis](https://walink.com/id/docs/free-links).

## Kesalahan dan batas permintaan

Setiap kesalahan punya bentuk yang sama:

```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 | Kode yang umum                                               | Artinya                                                          |
| ------ | ------------------------------------------------------------ | ---------------------------------------------------------------- |
| 401    | `invalid_token`                                              | Token tidak ada, kedaluwarsa, atau dicabut                       |
| 402    | `pool_exhausted`, `past_due_locked`, `subscription_required` | Kuota atau penagihan, diselesaikan di aplikasi                   |
| 403    | `insufficient_scope`                                         | `details.required` menyebutkan scope-nya                         |
| 404    | `not_found`                                                  | Juga untuk id milik akun lain                                    |
| 409    | `handle_taken`, `free_link_limit_reached`                    | Alamat sudah dipakai, atau sebuah batas tercapai                 |
| 422    | `validation_failed`, `handle_immutable`                      | Permintaan tidak valid. `details.fields` mencantumkan masalahnya |
| 429    | `rate_limited`                                               | Tunggu selama `Retry-After` detik                                |

| Permintaan                                        | Batas                   |
| ------------------------------------------------- | ----------------------- |
| Pembacaan                                         | 120 per menit per token |
| Pembuatan, pengeditan, publikasi, dan penghapusan | 30 per menit per akun   |
| Analitik                                          | 10 per menit per akun   |
| Pemeriksaan alamat                                | 30 per menit per akun   |

Batas ini bersifat perkiraan, dan kehabisan kuota tidak pernah dijawab dengan `429`. Lewat API, satu akun bisa punya hingga 500 draf per produk. Setiap respons membawa header `Request-Id`: sebutkan saat Anda menghubungi dukungan.

## Referensi lengkap

- [Referensi API](https://api.walink.com/docs): setiap endpoint dan kolom, dengan konsol.
- [Dokumen OpenAPI 3.1](https://api.walink.com/openapi.json) serta [enum dan batasan](https://api.walink.com/v1/reference), tanpa perlu token.
- [llms.txt](https://api.walink.com/llms.txt): aturan API, untuk alat AI.

Token yang sama juga menghubungkan asisten AI: lihat [Hubungkan asisten AI](https://walink.com/id/docs/mcp).
