SysAd API
ID EN

Dokumentasi API v1 disarankan

Panduan untuk membaca dan menulis data SysAd lewat HTTP. Semua contoh bisa disalin dan langsung dicoba.

Ketik alamat server API Anda, mis. https://api.perusahaan.co.id. Semua contoh di halaman ini ikut berubah dan bisa langsung disalin.

Mulai dari sini

Membaca data SysAd lewat API terdiri dari dua tahap: login untuk mendapat token, lalu memakai token itu pada setiap permintaan data. Login dilakukan dalam empat langkah singkat:

  1. Cek akunKirim user dan pass. Anda mendapat daftar perusahaan.
  2. Pilih entitasKirim id perusahaan. Anda mendapat daftar entitas.
  3. Pilih tahunKirim id perusahaan dan entitas. Anda mendapat daftar tahun.
  4. Minta tokenKirim semua pilihan tadi. Anda mendapat token.
Sudah tahu id perusahaan, entitas, dan tahunnya? Anda boleh langsung ke langkah 4 (minta token). Langkah 1 sampai 3 hanya untuk mengetahui id yang berlaku bagi akun Anda.

Setelah punya token, kirim di header token pada setiap permintaan data. Contoh mengambil data klien:

curl -G "https://alamat-server-anda/api/v1/master/client" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"cust_id":["C00001","C00002"]}]'

Konsep dasar

Autentikasi

  • Login memakai header user dan pass (dan id lain sesuai langkah).
  • Data memakai header token. Token berlaku 1 hari dan terikat pada perusahaan, entitas, dan tahun yang dipilih.
  • Akses lewat HTTPS bila tersedia, karena user, password, dan token ikut terkirim di header.

Membaca dan menulis

  • Endpoint GET hanya membaca data.
  • Endpoint POST/PUT mengubah data dan hanya bisa dipakai oleh akun API yang diberi hak menulis. Tanpa hak itu dijawab HTTP 403.

Filter data (options)

Sebagian besar endpoint data menerima options untuk menyaring hasil. Aturannya sama di mana pun:

  • options adalah array JSON berisi satu objek: [{ ... }]. Hanya objek pertama yang dibaca.
  • Setiap filter berupa array nilai, mis. "cust_id": ["C00001", "C00002"]. Data yang cocok dengan salah satu nilai ikut tampil (ATAU).
  • Bila memakai beberapa filter sekaligus, data harus cocok dengan semuanya (DAN).
  • Filter yang dihilangkan atau berupa array kosong berarti tidak dibatasi. [{}] berarti semua data.
  • Nilai harus persis sama dengan kode di SysAd (huruf besar/kecil dan spasi).
Cara mengirim (v1). options dikirim sebagai query string dan harus di-URL-encode, mis. ?options=%5B%7B%22cust_id%22%3A%5B%22C00001%22%5D%7D%5D. Contoh curl dan JavaScript di bawah sudah melakukannya untuk Anda. Pengecualian: endpoint Invoice (AR) tetap membaca options dari header.

Format respons

Semua endpoint menjawab dengan JSON yang bentuknya sama:

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [ ... ]
}
BagianArti
successtrue bila berhasil, false bila gagal. Selalu periksa nilai ini, bukan hanya status HTTP.
messageSuccess bila berhasil. Bila gagal, berisi alasan singkat dalam bahasa Inggris.
resultIsi data. Umumnya array objek (satu objek per baris data). Bisa array kosong [] bila tidak ada data yang cocok.
codeDisediakan untuk kompatibilitas. Gunakan success dan message.

Kode status dan pesan

Kegagalan login atau izin ditandai dengan status HTTP 4xx. Kegagalan pada data ditandai dengan success: false (status HTTP tetap 200).

Status HTTPPesanArtinya dan yang perlu dilakukan
401Invalid credentialUsername atau password salah.
401Invalid tokenToken tidak ada, rusak, atau tidak dikenal. Minta token baru.
401Token expiredToken sudah lewat 1 hari. Minta token baru.
401User expiredMasa berlaku akun sudah habis. Hubungi administrator.
403User is not registered to use APIAkun belum didaftarkan untuk memakai API. Hubungi administrator.
403... don't have access to create or modify dataAkun tidak punya hak menulis. Hubungi administrator.
429(tanpa isi)Terlalu banyak percobaan login dari satu alamat IP (bawaan maksimal 10 per menit; administrator dapat mengubahnya). Tunggu 1 menit.
200Invalid tokenPada endpoint data, bisa berarti isi options bukan JSON yang valid. Periksa bentuknya.
200Failed when getting data requested.Permintaan data gagal (mis. filter tidak sesuai). Periksa filter. Bila terus berulang, hubungi administrator dengan menyebutkan waktu kejadian.
200Invalid optionsIsi options tidak lengkap atau salah bentuk.
Catatan. Detail teknis kesalahan server sengaja tidak ditampilkan di respons demi keamanan. Administrator dapat melihatnya di log server.

Catatan pembaruan

Pembaruan keamanan

Bagi aplikasi yang sudah memakai API ini, ada beberapa perubahan yang perlu disesuaikan:

  • Token lama tidak berlaku. Format token berubah. Minta token baru lewat /api/lgn/token.
  • Header pass wajib juga di /api/lgn/entity dan /api/lgn/year (sebelumnya hanya user).
  • Status HTTP error kini 401 atau 403, bukan 200 dengan pengalihan. Isi JSON-nya tetap sama.
  • Batas login per alamat IP (bawaan 10 permintaan per menit; HTTP 429 bila terlampaui).
  • Pesan error lebih ringkas. Detail teknis hanya ada di log server.
  • Filter selalu berparameter. Tanda kutip dan karakter khusus pada nilai filter kini aman dan dianggap teks biasa.

Endpoint /api/v1/finance/ar yang tertulis di dokumentasi lama tidak pernah berfungsi. Alamat yang benar adalah /api/v1/finance/ar/get.

Perubahan data persetujuan (approval)

  • Persetujuan plan kini disimpan sebagai array JSON (name, role, time untuk tiap approver) dan dibaca dari satu tempat yang sama di Daftar plan dan Setujui plan.
  • Kolom app_by pada respons plan kini berisi array JSON tersebut (berupa teks). Kolom app_date dihapus; waktu persetujuan ada di dalam array (time).
  • Setujui plan (v1) kini memakai format app_by yang sama dengan versi awal: teks berisi array JSON. Teks biasa seperti "Budi" ditolak.

Referensi endpoint

Login

Empat langkah awal untuk mendapatkan token. Dipakai oleh semua versi.

GET /api/lgn/me Cek akun dan daftar perusahaan

Memeriksa username dan password Anda, lalu menampilkan daftar perusahaan (company) yang boleh Anda akses. Ini langkah pertama setiap kali login. Perlu user dan pass di header

Catatan. Hasilnya bisa kosong bila akun belum diberi akses ke perusahaan mana pun.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
userHeaderstringwajibUsername login SysAd Anda.
passHeaderstringwajibPassword akun tersebut.

Contoh permintaan

curl "https://alamat-server-anda/api/lgn/me" \
  -H "user: username_anda" \
  -H "pass: password_anda"
const response = await fetch(
  "https://alamat-server-anda/api/lgn/me",
  {
    method: "GET",
    headers: {
      "user": "username_anda",
      "pass": "password_anda"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "Id": "1",
      "Name": "AGENCY",
      "Value": "1",
      "Text": "PT Contoh Media"
    }
  ]
}

Arti isi result

KolomTipeKeterangan
IdstringId perusahaan. Dipakai sebagai header id (langkah entity) dan comp (langkah year dan token).
NamestringKode singkat perusahaan.
ValuestringSama dengan Id (untuk komponen dropdown).
TextstringNama perusahaan untuk ditampilkan ke pengguna.
GET /api/lgn/entity Daftar entitas dalam perusahaan

Menampilkan entitas (unit usaha) pada perusahaan yang Anda pilih. Id perusahaan diambil dari langkah sebelumnya. Perlu user dan pass di header

Perhatian. Sejak pembaruan keamanan, header pass wajib dikirim di endpoint ini. Sebelumnya hanya user dan id.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
userHeaderstringwajibUsername login SysAd Anda.
passHeaderstringwajibPassword akun tersebut.
idHeaderstringwajibId perusahaan, dari hasil /api/lgn/me (field Id).

Contoh permintaan

curl "https://alamat-server-anda/api/lgn/entity" \
  -H "user: username_anda" \
  -H "pass: password_anda" \
  -H "id: 1"
const response = await fetch(
  "https://alamat-server-anda/api/lgn/entity",
  {
    method: "GET",
    headers: {
      "user": "username_anda",
      "pass": "password_anda",
      "id": "1"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "Id": "DEMO",
      "Name": "DEMO-KOL.ADD",
      "Value": "DEMO",
      "Text": "DEMO"
    }
  ]
}

Arti isi result

KolomTipeKeterangan
IdstringId entitas. Dipakai sebagai header ent pada langkah berikutnya.
NamestringNama berkas konfigurasi entitas.
ValuestringSama dengan Id.
TextstringNama entitas untuk ditampilkan.
GET /api/lgn/year Daftar tahun data

Menampilkan tahun-tahun yang datanya tersedia pada entitas yang dipilih, dari yang terbaru. Perlu user dan pass di header

Perhatian. Sejak pembaruan keamanan, header pass wajib dikirim di endpoint ini.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
userHeaderstringwajibUsername login SysAd Anda.
passHeaderstringwajibPassword akun tersebut.
compHeaderstringwajibId perusahaan, dari /api/lgn/me.
entHeaderstringwajibId entitas, dari /api/lgn/entity.

Contoh permintaan

curl "https://alamat-server-anda/api/lgn/year" \
  -H "user: username_anda" \
  -H "pass: password_anda" \
  -H "comp: 1" \
  -H "ent: DEMO"
const response = await fetch(
  "https://alamat-server-anda/api/lgn/year",
  {
    method: "GET",
    headers: {
      "user": "username_anda",
      "pass": "password_anda",
      "comp": "1",
      "ent": "DEMO"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "Id": 2026,
      "Year": "2026",
      "Value": "2026",
      "Text": "2026"
    },
    {
      "Id": 2025,
      "Year": "2025",
      "Value": "2025",
      "Text": "2025"
    }
  ]
}

Arti isi result

KolomTipeKeterangan
IdnumberTahun dalam bentuk angka.
YearstringTahun dalam bentuk teks. Dikirim sebagai header year saat meminta token.
ValuestringSama dengan Year.
TextstringTahun untuk ditampilkan.
GET /api/lgn/token Minta token akses

Menukar kredensial dan pilihan perusahaan/entitas/tahun dengan sebuah token. Token inilah yang dikirim di header token pada semua endpoint data. Perlu user dan pass di header

Catatan. Token berlaku 1 hari. Setelah itu minta token baru dengan langkah yang sama.
Catatan. Token terikat pada perusahaan, entitas, dan tahun yang Anda pilih. Ganti salah satunya berarti minta token baru.
Perhatian. Perlakukan token seperti password: jangan ditaruh di URL, kode publik, atau log.
Perhatian. Endpoint login dibatasi per alamat IP (bawaan 10 permintaan per menit; administrator dapat mengubahnya). Bila terlampaui dijawab HTTP 429; tunggu 1 menit.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
userHeaderstringwajibUsername login SysAd Anda.
passHeaderstringwajibPassword akun tersebut.
compHeaderstringwajibId perusahaan, dari /api/lgn/me.
entHeaderstringwajibId entitas, dari /api/lgn/entity.
yearHeaderstringwajibTahun data 4 digit, dari /api/lgn/year.

Contoh permintaan

curl "https://alamat-server-anda/api/lgn/token" \
  -H "user: username_anda" \
  -H "pass: password_anda" \
  -H "comp: 1" \
  -H "ent: DEMO" \
  -H "year: 2026"
const response = await fetch(
  "https://alamat-server-anda/api/lgn/token",
  {
    method: "GET",
    headers: {
      "user": "username_anda",
      "pass": "password_anda",
      "comp": "1",
      "ent": "DEMO",
      "year": "2026"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": "eyJ1c2VyIjoi...(teks panjang)..."
}

Arti isi result

KolomTipeKeterangan
resultstringToken akses (teks panjang). Salin apa adanya, jangan diubah.

Master

Data referensi: klien, vendor, produk, budget, karyawan, dan struktur jabatan.

GET /api/v1/master/client Data klien

Mengambil daftar klien (customer). Perlu header token

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
cust_id array of string opsional Kode klien yang dicari. Kosongkan atau hapus bila tidak dibatasi. C00001
[{ "cust_id": ["C00001", "C00002"] }]

Contoh permintaan

curl -G "https://alamat-server-anda/api/v1/master/client" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"cust_id":["C00001","C00002"]}]'
const options = [{"cust_id":["C00001","C00002"]}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/master/client" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "GET",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "id": "C00001",
      "name": "PT Contoh Klien",
      "tax_name": "PT Contoh Klien",
      "ini": "PCK",
      "address": "Jl. Contoh No. 1",
      "address2": "Jakarta Selatan",
      "npwp": "01.234.567.8-901.000",
      "vatno": "",
      "pkp": "",
      "active": true
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
idstringKode klien.
namestringNama klien.
tax_namestringNama untuk keperluan pajak/faktur.
inistringInisial klien.
addressstringAlamat baris 1.
address2stringAlamat baris 2.
npwpstringNPWP.
vatnostringNomor VAT/PPN.
pkpstringData PKP (Pengusaha Kena Pajak).
activebooleantrue bila klien aktif.
GET /api/v1/master/vendor Data vendor

Mengambil daftar vendor (pemasok/media). Perlu header token

Catatan. Jumlah vendor bisa sangat banyak. Tanpa filter, seluruh vendor dikembalikan sekaligus, jadi gunakan vendor_id bila hanya butuh beberapa.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
vendor_id array of string opsional Kode vendor yang dicari. Kosongkan atau hapus bila tidak dibatasi. V00001
[{ "vendor_id": ["V00001"] }]

Contoh permintaan

curl -G "https://alamat-server-anda/api/v1/master/vendor" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"vendor_id":["V00001"]}]'
const options = [{"vendor_id":["V00001"]}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/master/vendor" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "GET",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "id": "V00001",
      "name": "PT Contoh Vendor",
      "type": "TV",
      "tax_name": "PT Contoh Vendor",
      "address": "Jl. Contoh No. 2",
      "address2": "",
      "npwp": "",
      "vatno": "",
      "pkp": "",
      "active": true
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
idstringKode vendor.
namestringNama vendor.
typestringJenis vendor.
tax_namestringNama untuk keperluan pajak/faktur.
addressstringAlamat baris 1.
address2stringAlamat baris 2.
npwpstringNPWP.
vatnostringNomor VAT/PPN.
pkpstringData PKP.
activebooleantrue bila vendor aktif.
GET /api/v1/master/product Data produk (brand)

Mengambil daftar produk beserta klien pemiliknya. Perlu header token

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
cust_id array of string opsional Kode klien pemilik produk. Kosongkan atau hapus bila tidak dibatasi. C00001
product_id array of string opsional Kode produk yang dicari. Kosongkan atau hapus bila tidak dibatasi. PRD001
[{ "cust_id": ["C00001"], "product_id": ["PRD001"] }]

Contoh permintaan

curl -G "https://alamat-server-anda/api/v1/master/product" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"cust_id":["C00001"],"product_id":["PRD001"]}]'
const options = [{"cust_id":["C00001"],"product_id":["PRD001"]}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/master/product" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "GET",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "cust_id": "C00001",
      "cust_name": "PT Contoh Klien",
      "id": "PRD001",
      "name": "Produk Contoh",
      "ini": "PRC",
      "adv": "PT Contoh Klien",
      "cat": null
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
cust_idstringKode klien pemilik produk.
cust_namestringNama klien.
idstringKode produk.
namestringNama produk.
inistringInisial produk.
advstringPengiklan (advertiser).
catstringKategori produk. Bisa kosong (null).
GET /api/v1/master/budget Data budget

Mengambil daftar budget pada tahun yang dipilih saat meminta token. Perlu header token

Perhatian. Tabel budget dibaca per tahun sesuai tahun pada token.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
cust_id array of string opsional Kode klien. Kosongkan atau hapus bila tidak dibatasi. C00001
product_id array of string opsional Kode produk. Kosongkan atau hapus bila tidak dibatasi. PRD001
budget_id array of string opsional Nomor budget. Kosongkan atau hapus bila tidak dibatasi. BD260001
[{ "budget_id": ["BD260001"] }]

Contoh permintaan

curl -G "https://alamat-server-anda/api/v1/master/budget" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"budget_id":["BD260001"]}]'
const options = [{"budget_id":["BD260001"]}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/master/budget" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "GET",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "cust_id": "C00001",
      "cust_name": "PT Contoh Klien",
      "product_id": "PRD001",
      "product_name": "Produk Contoh",
      "budget_id": "BD260001",
      "media": "T",
      "desc": "Kampanye Q1",
      "amount": 1000000000
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
cust_idstringKode klien.
cust_namestringNama klien.
product_idstringKode produk.
product_namestringNama produk.
budget_idstringNomor budget.
mediastringJenis media (huruf kode media).
descstringKeterangan budget.
amountnumberTotal nilai budget setahun, dihitung sesuai jenis budget (Original/Forecast/CPRP).
POST /api/v1/master/budget/create Buat budget baru

Membuat satu budget baru untuk sebuah produk. Nomor budget dibuat otomatis oleh sistem dan dikembalikan di respons. Perlu header token, akun harus berhak menulis

Catatan. Hanya objek pertama di dalam array yang diproses. Untuk membuat beberapa budget, kirim satu permintaan per budget.
Perhatian. Butuh akun API yang diberi hak menulis. Tanpa hak itu dijawab HTTP 403.
Perhatian. Bila po_id sudah dipakai, respons berisi success:false, pesan "PO Id ... already exist.", dan result berisi budget yang sudah ada.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
po_id string wajib Nomor PO dari klien. Tidak boleh sama dengan budget yang sudah ada. PO-2026-001
product_id string wajib Kode produk di SysAd. PRD001
period string wajib Tanggal periode kampanye, format yyyy-MM-dd. Gunakan tahun yang sama dengan tahun pada token. 2026-03-15
media string wajib Penempatan media: MT (televisi), MP (cetak), MR (radio), MC (bioskop), MD (digital), MO (lainnya). MT
value number opsional Nilai PO. Bila tidak dikirim dianggap 0. 1000000
type string opsional Jenis budget: O (original), F (forecast), C (CPRP), I (internal). Bila tidak dikirim dianggap O. O
desc string opsional Keterangan budget. Kampanye Q1
[{ "po_id": "PO-2026-001", "product_id": "PRD001", "period": "2026-03-15", "media": "MT", "value": 1000000, "type": "O", "desc": "Kampanye Q1" }]

Contoh permintaan

curl -X POST -G "https://alamat-server-anda/api/v1/master/budget/create" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"po_id":"PO-2026-001","product_id":"PRD001","period":"2026-03-15","media":"MT","value":1000000,"type":"O","desc":"Kampanye Q1"}]'
const options = [{"po_id":"PO-2026-001","product_id":"PRD001","period":"2026-03-15","media":"MT","value":1000000,"type":"O","desc":"Kampanye Q1"}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/master/budget/create" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "POST",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "budget_id": "BD260001"
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
budget_idstringNomor budget yang baru dibuat.
GET /api/v1/master/employee Data karyawan

Mengambil daftar karyawan. Perlu header token

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
emp_id array of string opsional Id karyawan yang dicari. Kosongkan atau hapus bila tidak dibatasi. 180001
[{ "emp_id": ["180001"] }]

Contoh permintaan

curl -G "https://alamat-server-anda/api/v1/master/employee" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"emp_id":["180001"]}]'
const options = [{"emp_id":["180001"]}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/master/employee" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "GET",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "id": "180001",
      "ini": "BS",
      "name": "Budi Santoso",
      "rate": 0,
      "dept": "H-3",
      "email": "budi@contoh.co.id",
      "group": "",
      "occupation": "Media Planner"
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
idstringId karyawan.
inistringInisial.
namestringNama karyawan.
ratenumberTarif karyawan.
deptstringDepartemen.
emailstringAlamat email.
groupstringGrup.
occupationstringJabatan.
GET /api/v1/master/chart Struktur jabatan (chart)

Mengambil struktur jabatan berbentuk pohon. Hubungan atasan-bawahan dibaca dari kolom parent yang menunjuk ke id. Perlu header token

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
chart_id array of string opsional Id jabatan (angka, dikirim sebagai teks). Kosongkan atau hapus bila tidak dibatasi. 10
[{ "chart_id": ["10"] }]

Contoh permintaan

curl -G "https://alamat-server-anda/api/v1/master/chart" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"chart_id":["10"]}]'
const options = [{"chart_id":["10"]}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/master/chart" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "GET",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "id": 10,
      "parent": 16,
      "name": "MEDIA DIRECTOR",
      "color": 16744703,
      "occupation": ""
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
idnumberId jabatan.
parentnumberId jabatan atasan.
namestringNama jabatan.
colornumberKode warna pada bagan.
occupationstringKeterangan jabatan.

Media

Media plan dan persetujuannya.

GET /api/v1/media/plan Daftar plan media

Mengambil daftar media plan beserta status order, persetujuan, dan invoice-nya. Perlu header token

Catatan. Semua isian options boleh dikosongkan. Tanpa filter, seluruh plan pada tahun token dikembalikan.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
from string opsional Tanggal awal periode data, format yyyy-MM-dd. Kosongkan untuk tidak dibatasi. 2026-01-01
to string opsional Tanggal akhir periode data, format yyyy-MM-dd. Kosongkan untuk tidak dibatasi. 2026-12-31
cust_id array of string opsional Kode klien. Kosongkan atau hapus bila tidak dibatasi. C00001
product_id array of string opsional Kode produk. Kosongkan atau hapus bila tidak dibatasi. PRD001
po_id array of string opsional Nomor PO klien. Kosongkan atau hapus bila tidak dibatasi. PO-2026-001
budget_id array of string opsional Nomor budget. Kosongkan atau hapus bila tidak dibatasi. BD260001
plan_id array of string opsional Nomor plan, format NOMOR.PLAN/JENIS.GRUP. Kosongkan atau hapus bila tidak dibatasi. AAA.260001/T.01
[{ "from": "2026-01-01", "to": "2026-12-31", "cust_id": ["C00001"] }]

Contoh permintaan

curl -G "https://alamat-server-anda/api/v1/media/plan" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"from":"2026-01-01","to":"2026-12-31","cust_id":["C00001"]}]'
const options = [{"from":"2026-01-01","to":"2026-12-31","cust_id":["C00001"]}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/media/plan" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "GET",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "plan_id": "AAA.260001/T.01",
      "cust_id": "C00001",
      "cust": "PT Contoh Klien",
      "product_id": "PRD001",
      "product": "Produk Contoh",
      "p_date": null,
      "desc": "Kampanye Q1",
      "from": "2026-03-01",
      "to": "2026-03-31",
      "ref": "PO-2026-001",
      "budget_id": "BD260001",
      "app_by": "[{\"name\":\"Budi\",\"role\":\"Manager\",\"time\":\"2026-03-02 10:15:00\"}]",
      "order_id": "",
      "order_date": "",
      "ins": 120,
      "value": 500000000,
      "paid": 450000000,
      "nett": 425000000,
      "media": "T",
      "adtype_id": "",
      "mcs_id": "",
      "mcs_date": "",
      "ar_id": "",
      "ar_date": null,
      "status": "",
      "fee": 15
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
plan_idstringNomor plan, format NOMOR.PLAN/JENIS.GRUP, mis. AAA.260001/T.01 (T = televisi, grup 01).
cust_idstringKode klien.
custstringNama klien.
product_idstringKode produk.
productstringNama produk.
p_datestringTanggal plan. Bisa kosong (null).
descstringKeterangan plan.
fromstringAwal periode tayang.
tostringAkhir periode tayang.
refstringNomor referensi/PO klien.
budget_idstringNomor budget yang dipakai.
app_bystringData persetujuan (approval) berupa array JSON (teks) berisi name, role, dan time setiap approver. Kosong bila belum disetujui.
order_idstringNomor order media.
order_datestringTanggal order.
insnumberJumlah penayangan/insertion.
valuenumberNilai gross.
paidnumberNilai yang dibayarkan.
nettnumberNilai nett.
mediastringJenis media.
adtype_idstringJenis iklan.
mcs_idstringNomor MCS.
mcs_datestringTanggal MCS.
ar_idstringNomor invoice (piutang).
ar_datestringTanggal invoice. Bisa kosong (null).
statusstringStatus plan.
feenumberFee agensi.
PUT /api/v1/media/plan/approve Setujui plan media

Mencatat persetujuan (approval) pada satu atau beberapa plan. Data persetujuan disimpan sebagai array JSON berisi nama, jabatan, dan waktu setiap approver. Perlu header token, akun harus berhak menulis

Catatan. Nilai app_by yang disimpan akan menggantikan data persetujuan sebelumnya pada plan itu. Untuk beberapa approver, masukkan semuanya dalam satu array.
Catatan. Data persetujuan yang sama bisa dibaca kembali lewat Daftar plan (kolom app_by).
Perhatian. Butuh akun API yang diberi hak menulis. Tanpa hak itu dijawab HTTP 403.
Perhatian. app_by harus berupa teks (string) yang isinya JSON, bukan array JSON langsung. Bila formatnya salah, respons berisi success:false dengan pesan "app_by must be in correct json format." atau menyebut properti yang kurang (name, role, atau time).

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Query string (?options=...) array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
plan_id string wajib Nomor plan, format NOMOR.PLAN/JENIS.GRUP. AAA.260001/T.01
app_by string wajib Teks berisi array JSON. Setiap anggota punya name (nama pemberi persetujuan), role (jabatan), dan time (waktu, yyyy-MM-dd HH:mm:ss). [{"name":"Budi","role":"Manager","time":"2026-03-02 10:15:00"}]
[{ "plan_id": "AAA.260001/T.01", "app_by": "[{\"name\":\"Budi\",\"role\":\"Manager\",\"time\":\"2026-03-02 10:15:00\"}]" }]

Contoh permintaan

curl -X PUT -G "https://alamat-server-anda/api/v1/media/plan/approve" \
  -H "token: TOKEN_ANDA" \
  --data-urlencode 'options=[{"plan_id":"AAA.260001/T.01","app_by":"[{\"name\":\"Budi\",\"role\":\"Manager\",\"time\":\"2026-03-02 10:15:00\"}]"}]'
const options = [{"plan_id":"AAA.260001/T.01","app_by":"[{\"name\":\"Budi\",\"role\":\"Manager\",\"time\":\"2026-03-02 10:15:00\"}]"}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/media/plan/approve" + "?options=" + encodeURIComponent(JSON.stringify(options)),
  {
    method: "PUT",
    headers: {
      "token": "TOKEN_ANDA"
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "plan_id": "AAA.260001/T.01",
      "app_by": "[{\"name\":\"Budi\",\"role\":\"Manager\",\"time\":\"2026-03-02 10:15:00\"}]"
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
plan_idstringNomor plan yang disetujui.
app_bystringData persetujuan yang tersimpan, berupa array JSON (teks) berisi name, role, dan time.

Finance

Data keuangan.

GET /api/v1/finance/ar/get Invoice (piutang)

Mengambil daftar invoice piutang (account receivable). Perlu header token

Catatan. Walau alamatnya di bawah /api/v1, endpoint ini membaca options dari header (bukan query string), berbeda dari endpoint v1 lainnya.
Perhatian. Filter berdasarkan klien (cust_id) dan rentang tanggal (from, to) belum didukung pada endpoint ini. Gunakan product_id atau inv_id.

Yang perlu dikirim

NamaDikirim lewatTipeWajibKeterangan
tokenHeaderstringwajibToken dari /api/lgn/token.
options Header array JSON opsional Berisi satu objek filter (lihat tabel di bawah). Boleh dihilangkan untuk mengambil semua data.

Isi options

NamaTipeWajibKeteranganContoh
product_id array of string opsional Kode produk. Kosongkan atau hapus bila tidak dibatasi. PRD001
inv_id array of string opsional Nomor invoice. Kosongkan atau hapus bila tidak dibatasi. INV-2026-0001
[{ "inv_id": ["INV-2026-0001"] }]

Contoh permintaan

curl "https://alamat-server-anda/api/v1/finance/ar/get" \
  -H "token: TOKEN_ANDA" \
  -H 'options: [{"inv_id":["INV-2026-0001"]}]'
const options = [{"inv_id":["INV-2026-0001"]}];

const response = await fetch(
  "https://alamat-server-anda/api/v1/finance/ar/get",
  {
    method: "GET",
    headers: {
      "token": "TOKEN_ANDA",
      "options": JSON.stringify(options)
    }
  }
);
const data = await response.json();
if (!data.success) { console.error(data.message); } else { console.log(data.result); }

Contoh respons sukses

{
  "code": 0,
  "success": true,
  "message": "Success",
  "result": [
    {
      "ar_id": "INV-2026-0001",
      "ar_date": "2026-03-05",
      "cust_id": "C00001",
      "cust": "PT Contoh Klien",
      "product_id": "PRD001",
      "product": "Produk Contoh",
      "due": "2026-04-04",
      "nett": 425000000,
      "fee": 63750000,
      "vat_id": "",
      "vat": 53625000,
      "amount": 542375000
    }
  ]
}

Arti setiap kolom pada result

KolomTipeKeterangan
ar_idstringNomor invoice.
ar_datestringTanggal invoice.
cust_idstringKode klien.
custstringNama klien.
product_idstringKode produk.
productstringNama produk.
duestringTanggal jatuh tempo.
nettnumberNilai nett.
feenumberFee agensi.
vat_idstringNomor faktur pajak.
vatnumberNilai PPN.
amountnumberTotal tagihan.

Tanya jawab

Respons berisi "Invalid token" padahal token saya benar?

Bila status HTTP-nya 200 tetapi pesannya Invalid token, biasanya yang salah adalah isi options: bukan JSON yang valid, bukan berbentuk array, atau (untuk v1) belum di-URL-encode. Periksa dengan alat seperti jsonlint.com. Bila status HTTP-nya 401, token memang tidak dikenali atau sudah kedaluwarsa; minta token baru.

Hasilnya kosong ([]) padahal datanya ada?

Periksa bahwa token dibuat untuk perusahaan, entitas, dan tahun yang tepat; data dibaca per tahun sesuai token. Periksa juga filternya: kode klien/produk harus persis sama, dan beberapa filter sekaligus berarti semuanya harus cocok.

Berapa lama token berlaku? Haruskah login ulang tiap kali?

Token berlaku 1 hari. Simpan token dan pakai berulang sampai kedaluwarsa. Anda tidak perlu login untuk setiap permintaan.

Saya tidak bisa membuat atau menyetujui data (HTTP 403)

Akun API Anda belum diberi hak menulis. Hubungi administrator SysAd Anda untuk mengaktifkannya.

Contoh curl tidak jalan di Windows

Contoh memakai tanda kutip tunggal (') dan \ untuk menyambung baris, yang cocok untuk Git Bash, Linux, dan macOS. Di Command Prompt Windows, tulis perintahnya dalam satu baris dan ganti kutip tunggal dengan kutip ganda (kutip ganda di dalam JSON diberi \). Cara termudah: pakai aplikasi seperti Postman atau Insomnia, atau gunakan contoh JavaScript.