J
Jangkauin

SaaS omni-channel

Dokumentasi developer

Dokumentasi API developer

Bangun integrasi di Jangkauin dengan workspace tenant dan akses API yang aman.

API base: https://staging.jangkauin.site/api/v1
VersiShortcut pencarian/

Ikhtisar

Gunakan API untuk mengelola tenant, channel, kontak, campaign, dan workflow inbox. Autentikasi dengan JWT untuk sesi user atau API key untuk server-to-server.

Semua route scope tenant memakai <tenant_id> di path. Simpan kredensial dengan aman dan rotasi key secara berkala.

Mulai cepat

  1. Daftarkan owner tenant via /auth/register.
  2. Simpan access_token dan refresh_token dengan aman.
  3. Gunakan Authorization: Bearer untuk aksi user dan X-API-Key untuk server-to-server.
  4. Buat channel, kontak, segmen, dan template.
  5. Antrikan campaign atau kirim pesan, lalu pantau inbox/webhook.

Unduhan

Ambil koleksi Postman atau spesifikasi OpenAPI untuk eksplor API secara lokal.

Autentikasi

JWT (Sesi pengguna)

Gunakan Authorization: Bearer <token>. Refresh token via /auth/refresh.

API key (Server-to-server)

Gunakan header X-API-Key. Tenant di-resolve dari key dan tercatat untuk usage.

Headers

Authorization: Bearer <access_token>
X-API-Key: <api_key>
Content-Type: application/json

Endpoint auth

POST/auth/registerRegistrasi

Buat akun user dan kembalikan access dan refresh token. Tenant dibuat saat aktivasi trial atau checkout berbayar.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/register \
  -H 'Content-Type: application/json' \
  -d '{"email":"owner@acme.com","password":"secret","otp_channel":"email"}'

Respons

{
  "data": {
    "token": "access_token",
    "refresh_token": "refresh_token",
    "onboarding_status": "pending_tenant",
    "user": {
      "id": "user_id",
      "email": "owner@acme.com"
    }
  }
}
POST/auth/loginLogin

Autentikasi dengan email dan password untuk mendapatkan access dan refresh token.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"owner@acme.com","password":"secret"}'

Respons

{
  "data": {
    "token": "access_token",
    "refresh_token": "refresh_token"
  }
}
POST/auth/refreshRefresh token

Tukar refresh token untuk access token baru dan refresh token yang dirotasi.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/refresh \
  -H 'Content-Type: application/json' \
  -d '{"refresh_token":"refresh_token"}'

Respons

{
  "data": {
    "token": "new_access_token",
    "refresh_token": "new_refresh_token"
  }
}
POST/auth/logoutLogout

Cabut access token saat ini dan akhiri sesi.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/logout \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
GET/auth/meAmbil profil

Kembalikan profil user saat ini beserta membership tenant.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/auth/me \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "user": {
      "id": "user_id",
      "email": "owner@acme.com"
    },
    "tenant": {
      "id": "tenant_id",
      "name": "Acme Inc"
    },
    "memberships": [
      {
        "tenant_id": "tenant_id",
        "role": "owner"
      }
    ]
  }
}
PATCH/auth/mePerbarui profil

Perbarui field profil user seperti nama.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/auth/me \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Owner Name"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/auth/me/change-passwordUbah password

Ubah password setelah memvalidasi password lama.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/me/change-password \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"current_password":"secret","new_password":"newsecret"}'

Respons

{
  "data": {
    "ok": true
  }
}
GET/auth/me/sessionsDaftar sesi

Daftar sesi aktif untuk user saat ini.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/auth/me/sessions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "sessions": [
      {
        "id": "session_id",
        "ip": "127.0.0.1",
        "created_at": "2024-08-17T10:12:00Z"
      }
    ]
  }
}
POST/auth/me/sessions/revokeCabut sesi

Cabut satu sesi berdasarkan session ID.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/me/sessions/revoke \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"session_id":"session_id"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/auth/me/sessions/revoke-allCabut semua sesi

Logout semua sesi untuk user saat ini.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/me/sessions/revoke-all \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/auth/me/mfa/toggleToggle MFA

Aktifkan atau nonaktifkan multi-factor authentication.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/me/mfa/toggle \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"enabled":true}'

Respons

{
  "data": {
    "enabled": true
  }
}
POST/auth/forgotLupa password

Kirim token reset password ke email user.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/forgot \
  -H 'Content-Type: application/json' \
  -d '{"email":"owner@acme.com"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/auth/resetReset password

Reset password menggunakan token yang valid.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/reset \
  -H 'Content-Type: application/json' \
  -d '{"token":"reset_token","password":"newsecret"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/auth/verifyVerifikasi akun

Verifikasi akun menggunakan token email.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/verify \
  -H 'Content-Type: application/json' \
  -d '{"token":"verify_token"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/auth/verify/requestMinta verifikasi

Minta token verifikasi email baru untuk user saat ini.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/auth/verify/request \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}

Coba langsung

Runner interaktif untuk flow SaaS yang paling umum. Pastikan CORS mengizinkan origin ini, atau test dari client server-side.

Flow

POST /auth/login

Respons

Belum ada response

Error

Error mengikuti Problem Details: { "type": "https://jangkauin.local/problems/bad_request", "title": "Bad Request", "details": "message", "validation": [{ "field": "email", "message": "Invalid value" }] }. Batas plan bisa mengembalikan 402 atau 403 tergantung guard.

Respons sukses dibungkus { data: ..., meta: { page, limit, total, sort, order, count, next_cursor } } saat metadata pagination tersedia.

Kenapa 400 sering muncul

Sebagian besar handler memvalidasi UUID param, field wajib, bentuk JSON, dan rule domain. Payload tidak valid, field kurang, atau gagal parsing akan jadi 400.

Peta error per-route (dari OpenAPI)

0 route

Dihasilkan dari spesifikasi OpenAPI. Setiap baris menampilkan response non-2xx yang dideklarasikan endpoint tersebut.

Belum ada error route di spesifikasi.

Contoh payload error standar

400

{"error":{"message":"invalid payload","code":"bad_request"}}

401

{"error":{"message":"unauthorized","code":"unauthorized"}}

403

{"error":{"message":"forbidden","code":"forbidden"}}

404

{"error":{"message":"not found","code":"not_found"}}

409

{"error":{"message":"conflict","code":"conflict"}}

402

{"error":{"message":"subscription required","code":"payment_required"}}

413

{"error":{"message":"payload too large","code":"payload_too_large"}}

429

{"error":{"message":"rate limit exceeded","code":"rate_limited"}}

500

{"error":{"message":"internal server error","code":"server_error"}}

400

Bad request

UUID tidak valid, JSON tidak valid, field wajib kosong, filter tidak didukung, email/phone tidak valid, atau payload salah.

401

Unauthorized

Token tidak ada/tidak valid, token expired, atau API key salah.

403

Forbidden

Role/permission ditolak, tenant mismatch, fitur nonaktif, atau demo read-only.

404

Not found

Resource ID tidak ditemukan atau tidak terlihat untuk tenant ini.

409

Conflict

Konflik state (contoh: sudah di-assign, slug/code duplikat).

402

Payment required

Fitur plan tidak aktif, subscription wajib, atau limit/usage habis.

413

Payload terlalu besar

Attachment melebihi batas ukuran atau constraint upload.

429

Rate limited

Terlalu banyak request atau proteksi abuse aktif.

501

Not implemented

Fitur belum tersedia di build ini (mis. dukungan provider belum lengkap).

500/503

Server error

Kegagalan tak terduga atau service dependensi tidak tersedia. Coba ulang dengan backoff.

Tenant & member

Tenant mewakili organisasi. Setiap request scope tenant harus menyertakan tenant ID di path.

GET/tenantsDaftar Tenant

Ambil daftar Tenant dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "tenants": [
      {
        "id": "tenant_id",
        "name": "Acme Inc"
      }
    ]
  }
}
POST/tenantsBuat Tenant

Buat Tenant baru dan kembalikan payload awal.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Acme Inc"}'

Respons

{
  "data": {
    "tenant": {
      "id": "tenant_id",
      "name": "Acme Inc"
    }
  }
}
GET/tenants/currentDetail Tenant

Ambil satu Tenant beserta konfigurasi dan status terbaru.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/current \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "tenant": {
      "id": "tenant_id",
      "name": "Acme Inc"
    }
  }
}
GET/tenants/<tenant_id>/membersDaftar Member

Ambil daftar Member dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/members \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "members": [
      {
        "id": "user_id",
        "email": "owner@acme.com",
        "role": "owner"
      }
    ]
  }
}
GET/tenants/<tenant_id>/members/<user_id>Detail Member

Ambil satu Member beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `user_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/members/<user_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "member": {
      "id": "user_id",
      "email": "owner@acme.com",
      "role": "owner"
    }
  }
}
PATCH/tenants/<tenant_id>/members/<user_id>Perbarui Member

Perbarui field Member dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `user_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/members/<user_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"role":"admin"}'

Respons

{
  "data": {
    "ok": true
  }
}
DELETE/tenants/<tenant_id>/members/<user_id>Hapus Member

Hapus Member dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `user_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/members/<user_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/inviteUndang Resource

Kirim undangan dan provision akses untuk Resource.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/invite \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"email":"agent@acme.com","role":"agent"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/invite/bulkUndang Resource

Kirim undangan dan provision akses untuk Resource.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/invite/bulk \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"emails":["agent1@acme.com","agent2@acme.com"],"role":"agent"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/invites/acceptUndang Resource

Kirim undangan dan provision akses untuk Resource.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/invites/accept \
  -H 'Content-Type: application/json' \
  -d '{"token":"invite_token","password":"changeme123","full_name":"Raka Aditya"}'

Respons

{
  "data": {
    "ok": true,
    "status": "accepted",
    "login_url": "/auth/login"
  }
}

Channel

Hubungkan channel Email atau WhatsApp POC. Flow login WhatsApp bisa mengembalikan data QR dummy pada build saat ini.

GET/tenants/<tenant_id>/channelsDaftar Channel

Ambil daftar Channel dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "channels": [
      {
        "id": "channel_id",
        "type": "email",
        "status": "active"
      }
    ]
  }
}
POST/tenants/<tenant_id>/channelsBuat Channel

Buat Channel baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"type":"email","provider":"smtp","name":"Support SMTP","config":{"host":"smtp.example.com","username":"support"}}'

Respons

{
  "data": {
    "channel": {
      "id": "channel_id",
      "type": "email",
      "status": "active"
    }
  }
}
GET/tenants/<tenant_id>/channels/<channel_id>Detail Channel

Ambil satu Channel beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/<channel_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "channel": {
      "id": "channel_id",
      "type": "email",
      "status": "active"
    }
  }
}
PATCH/tenants/<tenant_id>/channels/<channel_id>Perbarui Channel

Perbarui field Channel dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/<channel_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Support SMTP"}'

Respons

{
  "data": {
    "channel": {
      "id": "channel_id",
      "name": "Support SMTP"
    }
  }
}
DELETE/tenants/<tenant_id>/channels/<channel_id>Hapus Channel

Hapus Channel dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/<channel_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
PATCH/tenants/<tenant_id>/channels/<channel_id>/default-otpAksi Channel

Jalankan aksi pada Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/<channel_id>/default-otp \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
PATCH/tenants/<tenant_id>/channels/<channel_id>/rotate-secretRotasi Channel

Rotasi secret pada Channel dan batalkan nilai lama.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/<channel_id>/rotate-secret \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "secret": "new_secret"
  }
}
GET/tenants/<tenant_id>/channels/<channel_id>/healthDetail Channel

Ambil satu Channel beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/<channel_id>/health \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "status": "ok"
  }
}
POST/tenants/<tenant_id>/channels/<channel_id>/test-emailAksi Channel

Jalankan aksi pada Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/<channel_id>/test-email \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"to":"user@acme.com","subject":"Hello","body":"Hi"}'

Respons

{
  "data": {
    "ok": true
  }
}
GET/tenants/<tenant_id>/channels/whatsappDaftar Channel

Ambil daftar Channel dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "channels": [
      {
        "id": "wa_id",
        "status": "pending"
      }
    ]
  }
}
POST/tenants/<tenant_id>/channels/whatsappBuat Channel

Buat Channel baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Support WA","phone":"+628123456789"}'

Respons

{
  "data": {
    "channel": {
      "id": "wa_id",
      "status": "pending"
    }
  }
}
POST/tenants/<tenant_id>/channels/whatsapp/<wa_id>/loginLogin Channel

Autentikasi dan mulai sesi baru untuk Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id>/login \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "status": "pending",
    "qr": "data:image/png;base64,..."
  }
}
GET/tenants/<tenant_id>/channels/whatsapp/<wa_id>/statusStatus Channel

Cek status atau health terbaru untuk Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id>/status \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "status": "connected"
  }
}
GET/tenants/<tenant_id>/channels/whatsapp/streamStream Channel

Streaming update langsung untuk Channel via SSE.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Gunakan EventSource atau client SSE untuk stream.

SSE stream. Gunakan EventSource di browser.

curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/stream \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

event: init
data: {"ok":true}
GET/tenants/<tenant_id>/channels/whatsapp/<wa_id>/login-streamLogin Channel

Autentikasi dan mulai sesi baru untuk Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.

SSE stream. Gunakan EventSource di browser.

curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id>/login-stream \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

event: qr
data: {"qr":"data:image/png;base64,..."}
POST/tenants/<tenant_id>/channels/whatsapp/<wa_id>/sendKirim Channel

Kirim pesan Channel lewat channel yang dikonfigurasi.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id>/send \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"to":"+628123456789","body":"Hello"}'

Respons

{
  "data": {
    "message_id": "provider_message_id"
  }
}
POST/tenants/<tenant_id>/channels/whatsapp/<wa_id>/testAksi Channel

Jalankan aksi pada Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id>/test \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"to":"+628123456789","body":"Test"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/channels/whatsapp/<wa_id>/logoutLogout Channel

Akhiri sesi Channel dan cabut token.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id>/logout \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
DELETE/tenants/<tenant_id>/channels/whatsapp/<wa_id>Hapus Channel

Hapus Channel dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/channels/whatsapp/<wa_id>/import-contactsImpor Channel

Impor massal Channel dari file atau payload eksternal.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.

Gunakan multipart form upload dengan field file.

curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id>/import-contacts \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "imported": 120
  }
}
POST/tenants/<tenant_id>/channels/whatsapp/<wa_id>/inboundAksi Channel

Jalankan aksi pada Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `wa_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/whatsapp/<wa_id>/inbound \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"from":"+628123456789","to":"+628987654321","body":"Hello","message_id":"provider_msg_id"}'

Respons

{
  "data": {
    "ok": true
  }
}
GET/tenants/<tenant_id>/channels/telegramDaftar Channel

Ambil daftar Channel dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/telegram \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "channels": [
      {
        "id": "telegram_id",
        "status": "connected"
      }
    ]
  }
}
POST/tenants/<tenant_id>/channels/telegramBuat Channel

Buat Channel baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/telegram \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Telegram Support","bot_token":"<bot_token>","default_chat_id":"<chat_id>"}'

Respons

{
  "data": {
    "id": "telegram_id",
    "status": "disconnected"
  }
}
POST/tenants/<tenant_id>/channels/telegram/<telegram_id>/connectAksi Channel

Jalankan aksi pada Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `telegram_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/telegram/<telegram_id>/connect \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"bot_token":"<bot_token>","default_chat_id":"<chat_id>"}'

Respons

{
  "data": {
    "id": "telegram_id",
    "status": "connected"
  }
}
GET/tenants/<tenant_id>/channels/telegram/<telegram_id>/statusStatus Channel

Cek status atau health terbaru untuk Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `telegram_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/telegram/<telegram_id>/status \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "id": "telegram_id",
    "status": "connected"
  }
}
POST/tenants/<tenant_id>/channels/telegram/<telegram_id>/sendKirim Channel

Kirim pesan Channel lewat channel yang dikonfigurasi.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `telegram_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/telegram/<telegram_id>/send \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"chat_id":"<chat_id>","message":"Hello"}'

Respons

{
  "data": {
    "status": "sent"
  }
}
POST/tenants/<tenant_id>/channels/telegram/<telegram_id>/logoutLogout Channel

Akhiri sesi Channel dan cabut token.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `telegram_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/telegram/<telegram_id>/logout \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "status": "disconnected"
  }
}
DELETE/tenants/<tenant_id>/channels/telegram/<telegram_id>Hapus Channel

Hapus Channel dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `telegram_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/telegram/<telegram_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "status": "deleted"
  }
}
POST/tenants/<tenant_id>/channels/email/<channel_id>/sendKirim Channel

Kirim pesan Channel lewat channel yang dikonfigurasi.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/email/<channel_id>/send \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"to":"user@acme.com","subject":"Hello","body":"Hi"}'

Respons

{
  "data": {
    "ok": true,
    "message_id": "provider_message_id"
  }
}
POST/tenants/<tenant_id>/channels/email/<channel_id>/inboundAksi Channel

Jalankan aksi pada Channel.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `channel_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/email/<channel_id>/inbound \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"from":"user@acme.com","to":"support@acme.com","subject":"Help","body":"Need assistance","message_id":"msg_id"}'

Respons

{
  "data": {
    "ok": true
  }
}

Kontak

GET/tenants/<tenant_id>/contacts?limit=20&page=1Daftar Kontak

Ambil daftar Kontak dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Gunakan Authorization: Bearer <access_token> atau X-API-Key.
  • - Pagination tersedia via limit/page atau cursor.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts?limit=20&page=1 \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -H 'X-API-Key: <api_key>'

Respons

{
  "data": {
    "contacts": [],
    "page": 1,
    "limit": 20,
    "total": 0
  }
}
GET/tenants/<tenant_id>/contacts/<contact_id>Detail Kontak

Ambil satu Kontak beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `contact_id`.
  • - Gunakan Authorization: Bearer <access_token> atau X-API-Key.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts/<contact_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -H 'X-API-Key: <api_key>'

Respons

{
  "data": {
    "contact": {
      "id": "contact_id",
      "name": "Nadia"
    }
  }
}
POST/tenants/<tenant_id>/contactsBuat Kontak

Buat Kontak baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Gunakan Authorization: Bearer <access_token> atau X-API-Key.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -H 'X-API-Key: <api_key>' \
  -d '{"name":"Nadia","phone":"+628123456789","email":"nadia@acme.com"}'

Respons

{
  "data": {
    "id": "contact_id",
    "tenant_id": "tenant_id",
    "name": "Nadia",
    "phone": "+628123456789",
    "email": "nadia@acme.com",
    "wa_opt_in": true,
    "opt_out": false,
    "attributes": {},
    "created_at": "2024-08-17T10:12:00Z",
    "updated_at": "2024-08-17T10:12:00Z"
  }
}
PATCH/tenants/<tenant_id>/contacts/<contact_id>Perbarui Kontak

Perbarui field Kontak dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `contact_id`.
  • - Gunakan Authorization: Bearer <access_token> atau X-API-Key.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts/<contact_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -H 'X-API-Key: <api_key>' \
  -d '{"name":"Nadia","phone":"+628123456789","email":"nadia@acme.com","attributes":{"tier":"gold"}}'

Respons

{
  "data": {
    "contact": {
      "id": "contact_id",
      "name": "Nadia"
    }
  }
}
PATCH/tenants/<tenant_id>/contacts/<contact_id>/phonePerbarui Kontak

Perbarui field Kontak dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `contact_id`.
  • - Gunakan Authorization: Bearer <access_token> atau X-API-Key.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts/<contact_id>/phone \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -H 'X-API-Key: <api_key>' \
  -d '{"phone":"+628123456789"}'

Respons

{
  "data": {
    "ok": true
  }
}
PATCH/tenants/<tenant_id>/contacts/<contact_id>/opt-outAksi Kontak

Jalankan aksi pada Kontak.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `contact_id`.
  • - Gunakan Authorization: Bearer <access_token> atau X-API-Key.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts/<contact_id>/opt-out \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -H 'X-API-Key: <api_key>' \
  -d '{"opt_out":true}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/contacts/import-csvImpor Kontak

Impor massal Kontak dari file atau payload eksternal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.

Gunakan multipart form upload dengan field file.

curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts/import-csv \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "imported": 120
  }
}
GET/tenants/<tenant_id>/contacts/export-csvEkspor Kontak

Ekspor Kontak ke file yang bisa diunduh.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts/export-csv \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

CSV file download

Segmen

Segmen menyimpan filter dinamis dan dihitung saat dibutuhkan untuk campaign.

{
  "filters": [
    { "field": "tag", "op": "in", "value": ["vip", "trial"] },
    { "field": "channel", "op": "eq", "value": "whatsapp" },
    { "field": "opt_out", "op": "eq", "value": false },
    { "field": "custom.job_title", "op": "contains", "value": "manager" }
  ]
}
GET/tenants/<tenant_id>/segments?limit=20&page=1Daftar Segmen

Ambil daftar Segmen dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Pagination tersedia via limit/page atau cursor.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/segments?limit=20&page=1 \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "segments": [],
    "page": 1,
    "limit": 20,
    "total": 0
  }
}
POST/tenants/<tenant_id>/segmentsBuat Segmen

Buat Segmen baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/segments \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"VIP","filters":[{"field":"tag","op":"in","value":["vip"]}]}'

Respons

{
  "data": {
    "segment": {
      "id": "segment_id",
      "name": "VIP"
    }
  }
}
GET/tenants/<tenant_id>/segments/<segment_id>Detail Segmen

Ambil satu Segmen beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `segment_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/segments/<segment_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "segment": {
      "id": "segment_id",
      "name": "VIP"
    }
  }
}
PATCH/tenants/<tenant_id>/segments/<segment_id>Perbarui Segmen

Perbarui field Segmen dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `segment_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/segments/<segment_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"VIP","filters":[{"field":"tag","op":"in","value":["vip"]}]}'

Respons

{
  "data": {
    "segment": {
      "id": "segment_id",
      "name": "VIP"
    }
  }
}
DELETE/tenants/<tenant_id>/segments/<segment_id>Hapus Segmen

Hapus Segmen dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `segment_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/segments/<segment_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/segments/<segment_id>/previewPratinjau Segmen

Pratinjau output Segmen tanpa mengirim atau enqueue.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `segment_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/segments/<segment_id>/preview \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "count": 120
  }
}

Campaign

GET/tenants/<tenant_id>/campaigns?limit=20&page=1Daftar Campaign

Ambil daftar Campaign dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Pagination tersedia via limit/page atau cursor.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/campaigns?limit=20&page=1 \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "campaigns": [],
    "page": 1,
    "limit": 20,
    "total": 0
  }
}
POST/tenants/<tenant_id>/campaignsBuat Campaign

Buat Campaign baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/campaigns \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Promo Blast","channel_type":"email","segment_id":"segment_id","template_id":"template_id","schedule_at":"2024-09-01T09:00:00Z"}'

Respons

{
  "data": {
    "campaign": {
      "id": "campaign_id",
      "name": "Promo Blast"
    }
  }
}
GET/tenants/<tenant_id>/campaigns/<campaign_id>Detail Campaign

Ambil satu Campaign beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `campaign_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/campaigns/<campaign_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "campaign": {
      "id": "campaign_id",
      "name": "Promo Blast"
    }
  }
}
PATCH/tenants/<tenant_id>/campaigns/<campaign_id>Perbarui Campaign

Perbarui field Campaign dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `campaign_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/campaigns/<campaign_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Promo Blast Q3"}'

Respons

{
  "data": {
    "campaign": {
      "id": "campaign_id",
      "name": "Promo Blast Q3"
    }
  }
}
DELETE/tenants/<tenant_id>/campaigns/<campaign_id>Hapus Campaign

Hapus Campaign dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `campaign_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/campaigns/<campaign_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/campaigns/<campaign_id>/enqueueAntrikan Campaign

Antrikan Campaign untuk diproses oleh worker.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `campaign_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/campaigns/<campaign_id>/enqueue \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"dry_run":false}'

Respons

{
  "data": {
    "jobs_enqueued": 120
  }
}
GET/tenants/<tenant_id>/campaigns/<campaign_id>/jobsDetail Campaign

Ambil satu Campaign beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `campaign_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/campaigns/<campaign_id>/jobs \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "jobs": [
      {
        "id": "job_id",
        "status": "queued"
      }
    ]
  }
}

Inbox

Inbox bersama mendukung assignment, klaim, dan update SSE.

GET/tenants/<tenant_id>/conversations?limit=20&page=1Daftar Percakapan

Ambil daftar Percakapan dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Pagination tersedia via limit/page atau cursor.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations?limit=20&page=1 \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "conversations": [],
    "page": 1,
    "limit": 20,
    "total": 0
  }
}
GET/tenants/<tenant_id>/conversations/<conversation_id>Detail Percakapan

Ambil satu Percakapan beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `conversation_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/<conversation_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "conversation": {
      "id": "conversation_id",
      "status": "open"
    }
  }
}
POST/tenants/<tenant_id>/conversations/<conversation_id>/assignTetapkan Percakapan

Tetapkan Percakapan ke owner atau agent tertentu.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `conversation_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/<conversation_id>/assign \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"assignee_id":"user_id"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/conversations/<conversation_id>/claimKlaim Percakapan

Klaim Percakapan untuk agent saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `conversation_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/<conversation_id>/claim \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/conversations/<conversation_id>/unassignTetapkan Percakapan

Tetapkan Percakapan ke owner atau agent tertentu.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `conversation_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/<conversation_id>/unassign \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/conversations/<conversation_id>/mark-readTandai dibaca Percakapan

Tandai Percakapan sebagai dibaca untuk tenant ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `conversation_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/<conversation_id>/mark-read \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/conversations/bulk/mark-readBulk Percakapan

Jalankan aksi secara bulk pada banyak Percakapan.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/bulk/mark-read \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"ids":["conversation_id"]}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/conversations/<conversation_id>/reply/emailBalas Percakapan

Kirim balasan untuk percakapan atau pesan Percakapan.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `conversation_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/<conversation_id>/reply/email \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"subject":"Re: Help","body":"We can assist"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/conversations/<conversation_id>/closeAksi Percakapan

Jalankan aksi pada Percakapan.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `conversation_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/<conversation_id>/close \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
GET/tenants/<tenant_id>/conversations/<conversation_id>/messagesDetail Percakapan

Ambil satu Percakapan beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `conversation_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/<conversation_id>/messages \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "messages": [
      {
        "id": "message_id",
        "body": "Hello"
      }
    ]
  }
}
GET/tenants/<tenant_id>/conversations/streamStream Percakapan

Streaming update langsung untuk Percakapan via SSE.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Gunakan EventSource atau client SSE untuk stream.

SSE stream. Gunakan EventSource di browser.

curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/conversations/stream \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

event: init
data: {"ok":true}

Template

POST/tenants/<tenant_id>/templatesBuat Template

Buat Template baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/templates \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Order Update","channel_type":"email","body":"Hi {{name}}, your order shipped."}'

Respons

{
  "data": {
    "template": {
      "id": "template_id",
      "name": "Order Update"
    }
  }
}
GET/tenants/<tenant_id>/templatesDaftar Template

Ambil daftar Template dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/templates \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "templates": [
      {
        "id": "template_id",
        "name": "Order Update"
      }
    ]
  }
}
GET/tenants/<tenant_id>/templates/<template_id>Detail Template

Ambil satu Template beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `template_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/templates/<template_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "template": {
      "id": "template_id",
      "name": "Order Update"
    }
  }
}
PATCH/tenants/<tenant_id>/templates/<template_id>Perbarui Template

Perbarui field Template dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `template_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/templates/<template_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"Order Update v2"}'

Respons

{
  "data": {
    "template": {
      "id": "template_id",
      "name": "Order Update v2"
    }
  }
}
DELETE/tenants/<tenant_id>/templates/<template_id>Hapus Template

Hapus Template dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `template_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/templates/<template_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/templates/<template_id>/cloneAksi Template

Jalankan aksi pada Template.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `template_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/templates/<template_id>/clone \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "template": {
      "id": "template_id_copy",
      "name": "Order Update"
    }
  }
}

Webhook

Event meliputi message.sent, message.failed, contact.created, contact.updated, campaign.started, campaign.completed.

X-Jangkauin-Event: message.sent
X-Jangkauin-Webhook-ID: <webhook_id>
X-Jangkauin-Signature: HMAC_SHA256(raw_body)
POST/tenants/<tenant_id>/webhooksBuat Webhook

Buat Webhook baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"url":"https://example.com/webhooks/jangkauin","events":["message.sent","message.failed"]}'

Respons

{
  "data": {
    "webhook": {
      "id": "webhook_id",
      "status": "active"
    }
  }
}
GET/tenants/<tenant_id>/webhooksDaftar Webhook

Ambil daftar Webhook dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "webhooks": [
      {
        "id": "webhook_id",
        "status": "active"
      }
    ]
  }
}
PATCH/tenants/<tenant_id>/webhooks/<webhook_id>Perbarui Webhook

Perbarui field Webhook dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `webhook_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks/<webhook_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"url":"https://example.com/webhooks/jangkauin","events":["message.sent"]}'

Respons

{
  "data": {
    "webhook": {
      "id": "webhook_id",
      "status": "active"
    }
  }
}
DELETE/tenants/<tenant_id>/webhooks/<webhook_id>Hapus Webhook

Hapus Webhook dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `webhook_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks/<webhook_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
PATCH/tenants/<tenant_id>/webhooks/<webhook_id>/statusStatus Webhook

Cek status atau health terbaru untuk Webhook.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `webhook_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks/<webhook_id>/status \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"status":"active"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/webhooks/<webhook_id>/rotate-secretRotasi Webhook

Rotasi secret pada Webhook dan batalkan nilai lama.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `webhook_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks/<webhook_id>/rotate-secret \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "secret": "new_secret"
  }
}
GET/tenants/<tenant_id>/webhooks/<webhook_id>/logsDetail Webhook

Ambil satu Webhook beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `webhook_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks/<webhook_id>/logs \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "logs": [
      {
        "id": "log_id",
        "status": "delivered"
      }
    ]
  }
}
POST/tenants/<tenant_id>/webhooks/<webhook_id>/resend/<log_id>Kirim Webhook

Kirim pesan Webhook lewat channel yang dikonfigurasi.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `webhook_id`, `log_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks/<webhook_id>/resend/<log_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}

Storage

Upload menerima multipart file atau raw body untuk payload besar.

POST/tenants/<tenant_id>/storage/uploadAksi Resource

Jalankan aksi pada Resource.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.

Gunakan multipart form dengan field file atau kirim raw body.

curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/storage/upload \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "id": "object_id",
    "url": "https://...",
    "size": 1024
  }
}
GET/tenants/<tenant_id>/storage/objectsDaftar Resource

Ambil daftar Resource dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/storage/objects \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": [
    {
      "id": "object_id",
      "name": "file.png",
      "size": 1024
    }
  ]
}
DELETE/tenants/<tenant_id>/storage/objects/<object_id>Hapus Resource

Hapus Resource dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `object_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/storage/objects/<object_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}

API key

GET/tenants/<tenant_id>/api-keysDaftar API key

Ambil daftar API key dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/api-keys \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "keys": [
      {
        "id": "key_id",
        "name": "backend-prod",
        "status": "active"
      }
    ]
  }
}
POST/tenants/<tenant_id>/api-keysBuat API key

Buat API key baru dan kembalikan payload awal.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/api-keys \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"backend-prod"}'

Respons

{
  "data": {
    "id": "key_id",
    "name": "backend-prod",
    "secret": "secret",
    "status": "active"
  }
}
DELETE/tenants/<tenant_id>/api-keys/<key_id>Hapus API key

Hapus API key dan cabut aksesnya secara langsung.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `key_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X DELETE https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/api-keys/<key_id> \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
PATCH/tenants/<tenant_id>/api-keys/<key_id>/statusStatus API key

Cek status atau health terbaru untuk API key.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `key_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X PATCH https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/api-keys/<key_id>/status \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"status":"disabled"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/api-keys/<key_id>/rotateRotasi API key

Rotasi secret pada API key dan batalkan nilai lama.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `key_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/api-keys/<key_id>/rotate \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "secret": "new_secret"
  }
}
GET/tenants/<tenant_id>/api-keys/<key_id>/usageDetail API key

Ambil satu API key beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `key_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/api-keys/<key_id>/usage \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "usage": [
      {
        "path": "/contacts",
        "count": 120
      }
    ]
  }
}

Provider key & feature flag

GET/tenants/<tenant_id>/integrations/provider-keysDaftar Provider key

Ambil daftar Provider key dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/integrations/provider-keys \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "keys": [
      {
        "id": "provider_key_id",
        "provider": "xendit"
      }
    ]
  }
}
POST/tenants/<tenant_id>/integrations/provider-keys/<provider_key_id>/rotateRotasi Provider key

Rotasi secret pada Provider key dan batalkan nilai lama.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `provider_key_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/integrations/provider-keys/<provider_key_id>/rotate \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/tenants/<tenant_id>/integrations/provider-keys/<provider_key_id>/toggleToggle Provider key

Aktifkan atau nonaktifkan fitur pada Provider key.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `provider_key_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/integrations/provider-keys/<provider_key_id>/toggle \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"enabled":true}'

Respons

{
  "data": {
    "ok": true
  }
}
GET/tenants/<tenant_id>/integrations/provider-keys/<provider_key_id>/auditsDetail Provider key

Ambil satu Provider key beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `provider_key_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/integrations/provider-keys/<provider_key_id>/audits \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "audits": [
      {
        "id": "audit_id",
        "action": "rotate"
      }
    ]
  }
}
GET/tenants/<tenant_id>/integrations/feature-flagsDaftar Resource

Ambil daftar Resource dengan pagination sesuai tenant saat ini.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/integrations/feature-flags \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "flags": [
      {
        "key": "feature_webhooks",
        "enabled": true
      }
    ]
  }
}
POST/tenants/<tenant_id>/integrations/feature-flags/<flag_key>/toggleToggle Resource

Aktifkan atau nonaktifkan fitur pada Resource.

Cara pakai

  • - Ganti parameter path: `tenant_id`, `flag_key`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/integrations/feature-flags/<flag_key>/toggle \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"enabled":false}'

Respons

{
  "data": {
    "key": "feature_webhooks",
    "enabled": false
  }
}
GET/tenants/<tenant_id>/integrations/storageDetail Storage

Ambil satu Storage beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/integrations/storage \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "provider": "s3",
    "bucket": "jangkauin",
    "is_public": false
  }
}
POST/tenants/<tenant_id>/integrations/storagePerbarui Storage

Perbarui field Storage dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/integrations/storage \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"provider":"s3","bucket":"jangkauin","is_public":false}'

Respons

{
  "data": {
    "ok": true
  }
}

Penggunaan & statistik

GET/tenants/<tenant_id>/usage?key=messages_sent&months=6Detail Usage

Ambil satu Usage beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/usage?key=messages_sent&months=6 \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "usage": [
      {
        "month": "2024-08",
        "value": 1200
      }
    ]
  }
}
GET/tenants/<tenant_id>/statsDetail Resource

Ambil satu Resource beserta konfigurasi dan status terbaru.

Cara pakai

  • - Ganti parameter path: `tenant_id`.
  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/stats \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "contacts": 120,
    "messages": 4200,
    "campaigns": 5
  }
}

Billing

GET/plansDetail Resource

Ambil satu Resource beserta konfigurasi dan status terbaru.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/plans \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "plans": [
      {
        "code": "trial",
        "name": "Trial"
      }
    ]
  }
}
GET/billing/subscriptionDetail Billing

Ambil satu Billing beserta konfigurasi dan status terbaru.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/billing/subscription \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "plan_code": "trial",
    "status": "active"
  }
}
POST/billing/subscriptionAksi Billing

Jalankan aksi pada Billing.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/billing/subscription \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"plan_code":"growth"}'

Respons

{
  "data": {
    "plan_code": "growth",
    "status": "active"
  }
}
POST/billing/trial/activateAktifkan Billing

Aktifkan flow Billing dan siapkan data yang dibutuhkan.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/billing/trial/activate \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"tenant_payload":{"name":"Acme Inc","industry":"Retail","size":"1-10","billing_email":"owner@acme.com","use_case":"Support inbox"},"contact_phone":"+628123456789"}'

Respons

{
  "data": {
    "tenant": {
      "id": "tenant_id",
      "name": "Acme Inc"
    },
    "subscription": {
      "plan_code": "trial",
      "status": "active"
    },
    "token": "access_token",
    "refresh_token": "refresh_token"
  }
}
POST/billing/trial/requestAjukan Billing

Ajukan Billing untuk ditinjau.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/billing/trial/request \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"company_name":"Acme Inc","industry":"Retail","company_size":"1-10","work_email":"owner@acme.com","use_case":"Support inbox","notes":""}'

Respons

{
  "data": {
    "ok": true,
    "status": "pending_review"
  }
}
GET/billing/invoicesDetail Billing

Ambil satu Billing beserta konfigurasi dan status terbaru.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/billing/invoices \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "invoices": [
      {
        "id": "invoice_id",
        "external_id": "pay_123",
        "amount": 150000,
        "currency": "IDR",
        "plan_code": "growth",
        "status": "paid",
        "issued_at": "2024-12-01T10:00:00Z",
        "paid_at": "2024-12-01T10:10:00Z",
        "download_url": "/api/v1/billing/invoices/pay_123/download"
      }
    ],
    "page": 1,
    "limit": 20,
    "total": 1
  }
}
GET/billing/invoices/{external_id}/downloadDetail Billing

Ambil satu Billing beserta konfigurasi dan status terbaru.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/billing/invoices/{external_id}/download \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

<!doctype html><html><body>Invoice</body></html>
GET/billing/prefsDetail Billing

Ambil satu Billing beserta konfigurasi dan status terbaru.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/billing/prefs \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "email_enabled": true
  }
}
POST/billing/prefsPerbarui Billing

Perbarui field Billing dan kembalikan state terbaru bila tersedia.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/billing/prefs \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"email_enabled":true}'

Respons

{
  "data": {
    "ok": true
  }
}

Pembayaran

Request webhook memerlukan signature HMAC yang valid.

POST/payments/checkoutAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/checkout \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"plan_code":"growth","provider":"xendit","amount":150000,"currency":"IDR","tenant_payload":{"name":"Acme Inc","industry":"Retail","size":"1-10","billing_email":"owner@acme.com","use_case":"Support inbox"},"contact_phone":"+628123456789"}'

Respons

{
  "data": {
    "external_id": "pay_xxx",
    "checkout_url": "https://payments.example/checkout",
    "status": "pending"
  }
}
GET/payments/methodsDetail Pembayaran

Ambil satu Pembayaran beserta konfigurasi dan status terbaru.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/payments/methods \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": [
    {
      "payment_type": "invoice",
      "gateway": "xendit",
      "channel": "invoice",
      "active": true,
      "priority": 10
    }
  ]
}
POST/payments/invoicesAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/invoices \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"payment_type":"invoice","gateway":"auto","currency":"IDR","customer":{"name":"Acme Inc","email":"billing@acme.com","phone":"+628123456789"},"items":[{"name":"Plan Growth","category":"subscription","price":200000,"qty":1,"currency":"IDR"}],"callback":{"success_url":"https://app.example.com/thanks","failure_url":"https://app.example.com/failed"},"options":{"bank":"bca","installment":{"type":"offline","term":0}}}'

Respons

{
  "data": {
    "invoice_number": "inv_xxx",
    "status": "published",
    "gateway": "xendit",
    "payment_url": "https://pay.example"
  }
}
GET/payments/invoices/{number}Detail Pembayaran

Ambil satu Pembayaran beserta konfigurasi dan status terbaru.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
curl -X GET https://staging.jangkauin.site/api/v1/payments/invoices/{number} \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "number": "inv_xxx",
    "state": "published"
  }
}
POST/payments/subscriptionsAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/subscriptions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"payment_type":"invoice","gateway":"auto","currency":"IDR","interval_days":30,"customer":{"name":"Acme Inc","email":"billing@acme.com","phone":"+628123456789"},"items":[{"name":"Plan Growth","category":"subscription","price":200000,"qty":1,"currency":"IDR"}],"callback":{"success_url":"https://app.example.com/thanks","failure_url":"https://app.example.com/failed"},"options":{"bank":"bca","installment":{"type":"offline","term":0}}}'

Respons

{
  "data": {
    "number": "sub_xxx",
    "status": "active",
    "next_invoice_at": "2025-01-30T00:00:00Z"
  }
}
POST/payments/subscriptions/{number}/pauseAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/subscriptions/{number}/pause \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/payments/subscriptions/{number}/resumeAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/subscriptions/{number}/resume \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/payments/subscriptions/{number}/stopAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Kirim Authorization: Bearer <access_token>.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/subscriptions/{number}/stop \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>'

Respons

{
  "data": {
    "ok": true
  }
}
POST/payments/webhookAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/webhook \
  -H 'Content-Type: application/json' \
  -d '{"external_id":"pay_xxx","status":"paid","signature":"..."}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/payments/webhook/xenditAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/webhook/xendit \
  -H 'Content-Type: application/json' \
  -d '{"external_id":"pay_xxx","status":"PAID"}'

Respons

{
  "data": {
    "ok": true
  }
}
POST/payments/webhook/midtransAksi Pembayaran

Jalankan aksi pada Pembayaran.

Cara pakai

  • - Tidak perlu auth.
  • - Kirim JSON body sebagai application/json.
curl -X POST https://staging.jangkauin.site/api/v1/payments/webhook/midtrans \
  -H 'Content-Type: application/json' \
  -d '{"order_id":"pay_xxx","transaction_status":"settlement","status_code":"200","gross_amount":"150000.00","signature_key":"..."}'

Respons

{
  "data": {
    "ok": true
  }
}

Contoh: login

curl -X POST https://staging.jangkauin.site/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"dev@acme.com","password":"secret"}'

Respons

{
  "data": {
    "token": "access_token",
    "refresh_token": "refresh_token"
  }
}

Contoh: buat API key

curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/api-keys \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"name":"backend-prod"}'

Respons

{
  "data": {
    "id": "api_key_id",
    "name": "backend-prod",
    "secret": "api_key_secret",
    "status": "active"
  }
}

Contoh: kirim email

curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/channels/email/<channel_id>/send \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"to":"user@example.com","subject":"Hello","body":"Hi"}'

Respons

{
  "data": {
    "ok": true,
    "message_id": "provider_message_id"
  }
}

Contoh: daftar webhook

curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/webhooks \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <access_token>' \
  -d '{"url":"https://example.com/webhooks/jangkauin","events":["message.sent","message.failed"]}'

Respons

{
  "data": {
    "id": "webhook_id",
    "url": "https://example.com/webhooks/jangkauin",
    "events": [
      "message.sent",
      "message.failed"
    ],
    "status": "active"
  }
}

Contoh: buat kontak

curl -X POST https://staging.jangkauin.site/api/v1/tenants/<tenant_id>/contacts \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: <api_key>' \
  -d '{"name":"Nadia","phone":"+628123456789","email":"nadia@acme.com"}'

Respons

{
  "data": {
    "id": "contact_id",
    "tenant_id": "tenant_id",
    "name": "Nadia",
    "phone": "+628123456789",
    "email": "nadia@acme.com",
    "wa_opt_in": true,
    "opt_out": false,
    "attributes": {},
    "created_at": "2024-08-17T10:12:00Z",
    "updated_at": "2024-08-17T10:12:00Z"
  }
}