Panduan cepat API
Dalam sekitar 15 menit, chat sudah terpasang di situs Anda, Anda sudah melakukan panggilan API pertama, dan menerima webhook pertama.
1. Pasang widget di situs Anda
Di konsol, buka Situs, tambahkan situs web Anda, lalu salin kode sematannya. Tempel sebelum </body> di setiap halaman tempat chat harus muncul:
<script src="https://cdn.sealreply.com/widget.js" data-site-key="sk_…" async></script>Widget hanya dimuat di domain yang Anda daftarkan untuk situs tersebut, dan hanya setelah Anda memverifikasi domain pertama (dengan data DNS TXT atau berkas). Lihat Pasang widget.
2. Buat kunci API
Buka Developer → Buat kunci API. Untuk panduan ini, centang conversations:read dan messages:write. Salin kuncinya — diawali sr_live_ dan hanya ditampilkan sekali. Simpan di server Anda: siapa pun yang memegang kunci ini bisa bertindak atas nama ruang kerja Anda sesuai hak aksesnya.
3. Lakukan panggilan pertama
Mulai chat dari situs Anda sebagai pengunjung agar ada percakapan yang menunggu, lalu tampilkan daftar percakapan yang menunggu:
curl https://api.sealreply.com/v1/conversations?status=waiting \
-H "Authorization: Bearer $SEALREPLY_API_KEY"Setiap respons punya bentuk yang sama:
{ "success": true, "data": [{ "id": "0192…", "status": "waiting", "visitor": { "display_name": "Visitor #4821" } }], "error": null, "meta": { "has_more": false, "next_cursor": null } }Sekarang balas percakapan yang paling lama sebagai integrasi Anda. Program lengkapnya, dalam bahasa pemrograman Anda:
// Your first API calls in Node.js (18+): list waiting conversations and
// answer the oldest as your integration. Needs a key with conversations:read
// and messages:write.
const API = process.env.SEALREPLY_API_URL ?? "https://api.sealreply.com";
const KEY = process.env.SEALREPLY_API_KEY;
async function call(method, path, body) {
const res = await fetch(API + path, {
method,
headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
body: body && JSON.stringify(body),
});
const json = await res.json();
if (!json.success) throw new Error(`${res.status} ${json.error.code}: ${json.error.message}`);
return json.data;
}
const waiting = await call("GET", "/v1/conversations?status=waiting");
console.log(`${waiting.length} waiting`);
const oldest = waiting.at(-1);
if (oldest) {
const message = await call("POST", `/v1/conversations/${oldest.id}/messages`, {
client_msg_id: crypto.randomUUID(), // makes retries safe
content_type: "text",
text: "Thanks for waiting! Someone will be with you in a minute.",
});
console.log(`replied to ${oldest.visitor.display_name}: ${message.id}`);
}"""Your first API calls in Python 3 (standard library only): list waiting
conversations and answer the oldest as your integration. Needs a key with
conversations:read and messages:write."""
import json
import os
import urllib.error
import urllib.request
import uuid
API = os.environ.get("SEALREPLY_API_URL", "https://api.sealreply.com")
KEY = os.environ["SEALREPLY_API_KEY"]
def call(method, path, body=None):
req = urllib.request.Request(
API + path,
method=method,
data=json.dumps(body).encode() if body is not None else None,
headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"},
)
try:
with urllib.request.urlopen(req) as res:
return json.load(res)["data"]
except urllib.error.HTTPError as e:
err = json.load(e)["error"]
raise SystemExit(f"{e.code} {err['code']}: {err['message']}")
waiting = call("GET", "/v1/conversations?status=waiting")
print(f"{len(waiting)} waiting")
if waiting:
oldest = waiting[-1]
message = call("POST", f"/v1/conversations/{oldest['id']}/messages", {
"client_msg_id": str(uuid.uuid4()), # makes retries safe
"content_type": "text",
"text": "Thanks for waiting! Someone will be with you in a minute.",
})
print(f"replied to {oldest['visitor']['display_name']}: {message['id']}")<?php
// Your first API calls in PHP 7.4+ (curl extension): list waiting
// conversations and answer the oldest as your integration. Needs a key with
// conversations:read and messages:write.
$api = getenv('SEALREPLY_API_URL') ?: 'https://api.sealreply.com';
$key = getenv('SEALREPLY_API_KEY');
function sealreply_call(string $method, string $path, ?array $body = null)
{
global $api, $key;
$ch = curl_init($api . $path);
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer $key", 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => $body === null ? null : json_encode($body),
]);
$json = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (!$json['success']) {
fwrite(STDERR, "$status {$json['error']['code']}: {$json['error']['message']}\n");
exit(1);
}
return $json['data'];
}
$waiting = sealreply_call('GET', '/v1/conversations?status=waiting');
echo count($waiting) . " waiting\n";
if ($waiting) {
$oldest = end($waiting);
$message = sealreply_call('POST', "/v1/conversations/{$oldest['id']}/messages", [
'client_msg_id' => bin2hex(random_bytes(16)), // makes retries safe
'content_type' => 'text',
'text' => 'Thanks for waiting! Someone will be with you in a minute.',
]);
echo "replied to {$oldest['visitor']['display_name']}: {$message['id']}\n";
}//go:build ignore
// Your first API calls in Go (standard library only): list waiting
// conversations and answer the oldest as your integration. Needs a key with
// conversations:read and messages:write.
package main
import (
"bytes"
"crypto/rand"
"encoding/hex"
"encoding/json"
"fmt"
"log"
"net/http"
"os"
)
var (
api = envOr("SEALREPLY_API_URL", "https://api.sealreply.com")
key = os.Getenv("SEALREPLY_API_KEY")
)
func envOr(name, fallback string) string {
if v := os.Getenv(name); v != "" {
return v
}
return fallback
}
// call sends a request and decodes the envelope's data into out.
func call(method, path string, body, out any) error {
var payload bytes.Buffer
if body != nil {
if err := json.NewEncoder(&payload).Encode(body); err != nil {
return err
}
}
req, err := http.NewRequest(method, api+path, &payload)
if err != nil {
return err
}
req.Header.Set("Authorization", "Bearer "+key)
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer res.Body.Close()
var env struct {
Success bool `json:"success"`
Data json.RawMessage `json:"data"`
Error *struct{ Code, Message string }
}
if err := json.NewDecoder(res.Body).Decode(&env); err != nil {
return err
}
if !env.Success {
return fmt.Errorf("%d %s: %s", res.StatusCode, env.Error.Code, env.Error.Message)
}
return json.Unmarshal(env.Data, out)
}
type conversation struct {
ID string `json:"id"`
Visitor struct {
DisplayName string `json:"display_name"`
} `json:"visitor"`
}
func main() {
var waiting []conversation
if err := call("GET", "/v1/conversations?status=waiting", nil, &waiting); err != nil {
log.Fatal(err)
}
fmt.Printf("%d waiting\n", len(waiting))
if len(waiting) == 0 {
return
}
oldest := waiting[len(waiting)-1]
id := make([]byte, 16)
rand.Read(id)
var message struct{ ID string }
err := call("POST", "/v1/conversations/"+oldest.ID+"/messages", map[string]string{
"client_msg_id": hex.EncodeToString(id), // makes retries safe
"content_type": "text",
"text": "Thanks for waiting! Someone will be with you in a minute.",
}, &message)
if err != nil {
log.Fatal(err)
}
fmt.Printf("replied to %s: %s\n", oldest.Visitor.DisplayName, message.ID)
}Jalankan dengan SEALREPLY_API_KEY=sr_live_… node first-call.mjs (atau yang setara). Balasan muncul di widget pengunjung dan, dengan tanda Integrasi, di konsol. Program-program ini dijalankan terhadap API di rangkaian pengujian kami, jadi berfungsi persis seperti yang tertulis.
4. Terima webhook
Buka Developer → Webhook → Tambah endpoint, masukkan URL HTTPS di server Anda, lalu pilih message.created. Salin rahasia penandatanganan (whsec_…). Kirim event uji dari konsol, lalu verifikasi tanda tangan seperti dijelaskan di Menerima webhook.
Langkah berikutnya
- Autentikasi dan batasan: scope, batas laju, panggilan bulanan.
- Request dan error: paginasi, idempotensi, kode error.
- Referensi API: setiap endpoint dan field.