Developer

ttdHUB API

REST API tanda tangan elektronik ttdHUB: dokumen, penerima, field, permintaan tanda tangan, jejak audit, webhook, penandatanganan tersemat, dan API mitra.

Ikhtisar & autentikasi

Semua endpoint berada di bawah /api/v1 pada domain ttdHUB Anda dan memakai JSON (kecuali unggah berkas: multipart/form-data).

Autentikasi organisasi: header X-API-Key: ttd_… (buat di halaman Integrasi). Kunci mewarisi peran penggunanya; peran Peninjau hanya dapat membaca. Operasi tulis lewat API key membutuhkan fitur paket api_webhooks (paket Bisnis); membaca, mengunduh, audit, dan ekspor selalu boleh.

Autentikasi mitra: header X-Partner-Key: ttdp_… di bawah /partner-api. Untuk bertindak atas organisasi pelanggan, sertakan juga X-Organization-Id. Semua endpoint Dokumen, Penerima, Field, Permintaan tanda tangan, Audit, dan Embed tersedia di bawah /partner-api/… dengan jalur yang sama (mis. POST /partner-api/documents) dan dijalankan sebagai akun layanan organisasi tersebut. Mitra tidak pernah memegang kunci atau sesi pemilik organisasi.

Galat: {error, code?}. Batas paket: 402 {code:'plan_required', feature, required_plan, required_plan_name}; kuota: 402 {code:'quota_exceeded', key, limit, used, period}. Urutan pemeriksaan: 401 → 403 → 404 → 400 → 402.

Batas laju: 600 permintaan/menit per IP untuk /api/v1, dan 600/menit per kunci mitra.

Uang selalu dalam rupiah bulat (integer).

Basis URL: https://paraf.ai.id/api/v1 · Versi 1.0.0

Mulai cepat

Buat API key di Integrasi, lalu unggah, siapkan, dan kirim dokumen:

# 1. Unggah PDF
curl -X POST "https://paraf.ai.id/api/v1/documents" -H "X-API-Key: $TTD_KEY" -F "[email protected]" -F "title=Kontrak kerja"

# 2. Tambah field tanda tangan untuk penerima (koordinat 0–1 dari halaman)
curl -X POST "https://paraf.ai.id/api/v1/document-roles" -H "X-API-Key: $TTD_KEY" -H "Content-Type: application/json" \
  -d '{"document_id":"<DOC_ID>","name":"Budi","email":"[email protected]","signer_type":"signer"}'
curl -X POST "https://paraf.ai.id/api/v1/form-fields" -H "X-API-Key: $TTD_KEY" -H "Content-Type: application/json" \
  -d '{"document_id":"<DOC_ID>","document_role_id":"<ROLE_ID>","page_number":1,"ff_type":"signature","x":0.1,"y":0.8,"w":0.3,"h":0.08}'

# 3. Kirim
curl -X POST "https://paraf.ai.id/api/v1/sign-requests/create-with-document-roles" -H "X-API-Key: $TTD_KEY" -H "Content-Type: application/json" \
  -d '{"document_id":"<DOC_ID>","document_roles":[{"id":"<ROLE_ID>","name":"Budi","email":"[email protected]"}]}'

Verifikasi webhook

Setiap webhook membawa X-ttdHUB-Event, X-ttdHUB-Timestamp, dan X-ttdHUB-Signature (HMAC-SHA256 hex atas timestamp.isi-mentah).

// Node.js: verifikasi webhook ttdHUB
const crypto = require('crypto');
function verify(rawBody, headers, secret) {
  const ts = headers['x-ttdhub-timestamp'];
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // tolak pengulangan
  const expected = crypto.createHmac('sha256', secret).update(ts + '.' + rawBody).digest('hex');
  const got = String(headers['x-ttdhub-signature'] || '');
  return got.length === expected.length && crypto.timingSafeEqual(Buffer.from(got), Buffer.from(expected));
}

Penandatanganan tersemat (mitra)

Server Anda memanggil POST /api/v1/partner-api/embed/sign-url; tampilkan URL-nya dalam iframe. Halaman ttdHUB mengirim postMessage hanya ke origin Anda yang disetujui, dengan isi {type, sign_request_id}.

<!-- Halaman mitra (origin harus disetujui, mis. https://app.mitra.co.id) -->
<iframe src="<url dari POST /embed/sign-url>" title="Tanda tangan dokumen" allow="clipboard-write"></iframe>
<script>
window.addEventListener('message', (e) => {
  if (e.origin !== 'https://paraf.ai.id') return;           // hanya pesan dari ttdHUB
  if (e.data && e.data.type === 'ttdhub:signed') { /* selesai: e.data.sign_request_id */ }
  if (e.data && e.data.type === 'ttdhub:declined') { /* ditolak */ }
});
</script>

Dokumen

Unggah PDF, lihat, unduh, dan batalkan dokumen. Dokumen baru berstatus draft.

GET/documents

Daftar dokumen

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /documents
NamaTipeKeterangan
qstring · queryCari judul — maks. 200 karakter
statusstring · querysalah satu: "draft", "sent", "completed", "voided", "declined", "expired"
folder_idstring (uuid) · query
scopestring · query`mine` = hanya dokumen milik pemanggil — salah satu: "mine", "team"
limitinteger · querymin 1 · maks 200 · bawaan 100
offsetinteger · querymin 0 · bawaan 0

Respons

  • 200OK
  • 401Kredensial tidak ada atau tidak valid

POST/documents

Unggah dokumen PDF

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

PDF maksimal 25 MB. Dokumen baru berstatus draft.

Isi permintaan (multipart/form-data)

Isi permintaan /documents
NamaTipeKeterangan
file wajibstring (binary)Berkas PDF (application/pdf)
titlestringJudul; bawaan: nama berkas tanpa .pdf — maks. 200 karakter

Respons

  • 201Dokumen dibuat
  • 400Input tidak valid
  • 401Kredensial tidak ada atau tidak valid
  • 402Fitur di luar paket atau kuota habis
  • 403Peran tidak mengizinkan, sesi browser diperlukan, atau mitra ditangguhkan
  • 413Berkas terlalu besar

POST/documents/import

Ambil PDF dari URL publik

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

URL diambil server (dilindungi SSRF: hanya alamat publik, tanpa pengalihan), maksimal 25 MB.

Isi permintaan (application/json)

Isi permintaan /documents/import
NamaTipeKeterangan
url wajibstring (uri)maks. 2048 karakter
titlestringmaks. 200 karakter

Respons

  • 201Dokumen dibuat
  • 400Input tidak valid

GET/documents/{id}

Detail dokumen beserta halaman, penerima, dan field

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /documents/{id}
NamaTipeKeterangan
id wajibstring (uuid) · path

Respons

  • 200OK
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

PATCH/documents/{id}

Ubah folder atau judul (judul hanya untuk draf)

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /documents/{id}
NamaTipeKeterangan
id wajibstring (uuid) · path

Isi permintaan (application/json)

Isi permintaan /documents/{id}
NamaTipeKeterangan
folder_idstring | null (uuid)
titlestringmaks. 200 karakter

Respons

  • 200OK
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

GET/documents/{id}/file.pdf

Unduh PDF

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Salinan yang belum selesai diberi watermark DRAF. signed=1 mengunduh salinan final bersegel (PAdES) setelah selesai.

Parameter

Parameter /documents/{id}/file.pdf
NamaTipeKeterangan
id wajibstring (uuid) · path
signedstring · querysalah satu: "1"
rawstring · queryTanpa watermark; hanya untuk pengguna yang dapat mengubah dokumen — salah satu: "1"

Respons

  • 200PDF
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

POST/documents/{id}/void

Batalkan dokumen yang sedang berjalan

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Selalu tersedia lewat API key, apa pun paketnya. Memicu webhook voided.

Parameter

Parameter /documents/{id}/void
NamaTipeKeterangan
id wajibstring (uuid) · path

Isi permintaan (application/json)

Isi permintaan /documents/{id}/void
NamaTipeKeterangan
reasonstringmaks. 500 karakter

Respons

  • 200OK
  • 400Input tidak valid
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

Penerima

Peran penerima dokumen (Penanda tangan, Penyetuju, Peninjau/tembusan). Field ditautkan ke peran.

POST/document-roles

Tambah penerima ke dokumen

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Isi permintaan (application/json)

Isi permintaan /document-roles
NamaTipeKeterangan
document_id wajibstring (uuid)
namestringmaks. 254 karakter
emailstring (email)maks. 254 karakter
signer_typestringsigner = Penanda tangan, approver = Penyetuju, viewer/cc = Peninjau (tembusan) — salah satu: "signer", "approver", "viewer", "cc"
queue_positioninteger
routing_stageintegermin 1 · maks 50
is_enabledboolean
require_verificationbooleanWajib OTP
otp_channelstringsalah satu: "email", "sms"
phonestringUntuk OTP SMS (E.164, mis. +6281234567890)
require_idbooleanWajib verifikasi identitas
access_codestring | nullKode akses; tidak pernah dikembalikan — maks. 100 karakter
receives_final_copyboolean
badge_colorstring

Respons

  • 201Dibuat
  • 400Input tidak valid
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

PUT/document-roles/{id}

Ubah penerima

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /document-roles/{id}
NamaTipeKeterangan
id wajibstring (uuid) · path

Isi permintaan (application/json)

Isi permintaan /document-roles/{id}
NamaTipeKeterangan
namestringmaks. 254 karakter
emailstring (email)maks. 254 karakter
signer_typestringsigner = Penanda tangan, approver = Penyetuju, viewer/cc = Peninjau (tembusan) — salah satu: "signer", "approver", "viewer", "cc"
queue_positioninteger
routing_stageintegermin 1 · maks 50
is_enabledboolean
require_verificationbooleanWajib OTP
otp_channelstringsalah satu: "email", "sms"
phonestringUntuk OTP SMS (E.164, mis. +6281234567890)
require_idbooleanWajib verifikasi identitas
access_codestring | nullKode akses; tidak pernah dikembalikan — maks. 100 karakter
receives_final_copyboolean
badge_colorstring

Respons

  • 200OK
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

DELETE/document-roles/{id}

Hapus penerima

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /document-roles/{id}
NamaTipeKeterangan
id wajibstring (uuid) · path

Respons

  • 204Dihapus

Field

Field formulir pada halaman PDF. Koordinat x, y, w, h adalah pecahan 0–1 dari lebar/tinggi halaman, titik asal kiri atas.

POST/form-fields

Tambah satu field

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Isi permintaan (application/json)

Isi permintaan /form-fields
NamaTipeKeterangan
document_id wajibstring (uuid)
document_role_idstring | null (uuid)
page_numberintegermin 1 · bawaan 1
ff_type wajibstringsalah satu: "signature", "initials", "date", "text", "checkbox", "dropdown", "radio", "stamp", "attachment", "number", "formula"
x wajibnumbermin 0 · maks 1
y wajibnumbermin 0 · maks 1
w wajibnumbermin 0 · maks 1
h wajibnumbermin 0 · maks 1
is_requiredbooleanbawaan true
font_sizeintegerbawaan 12
validationstringsalah satu: "none", "email", "number", "date"
auto_fillstringsalah satu: "none", "name", "email", "date"
lockedbooleanNilai diisi pengirim dan dikunci
valuestring | nullmaks. 2000 karakter
choicesarray<string> | nullPilihan dropdown/radio; untuk lampiran: `[teks permintaan]`
namestringWajib untuk angka/rumus — pola ^[a-z][a-z0-9_]{0,31}$
formulastringUntuk ff_type=formula, mis. `harga * jumlah`
minnumber
maxnumber
conditionobject | nullTampilkan field hanya bila kondisi terpenuhi
condition.field_id wajibstringId field pengendali (atau `ref` dalam batch)
condition.op wajibstringsalah satu: "checked", "unchecked", "equals", "not_equals", "not_empty"
condition.valuestring | number

Respons

  • 201Dibuat
  • 400Input tidak valid
  • 402Fitur di luar paket atau kuota habis

POST/form-fields/update-many

Simpan banyak field sekaligus (buat & ubah)

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Entri dengan id mengubah field yang ada; tanpa id membuat field baru. ref (≤ 64 karakter) dapat dirujuk oleh condition.field_id field lain dalam batch yang sama. Maksimal 1000 field.

Isi permintaan (application/json)

Isi permintaan /form-fields/update-many
NamaTipeKeterangan
document_id wajibstring (uuid)
fields wajibarray<object>maks. 1000 item
fields[].document_role_idstring | null (uuid)
fields[].page_numberintegermin 1 · bawaan 1
fields[].ff_type wajibstringsalah satu: "signature", "initials", "date", "text", "checkbox", "dropdown", "radio", "stamp", "attachment", "number", "formula"
fields[].x wajibnumbermin 0 · maks 1
fields[].y wajibnumbermin 0 · maks 1
fields[].w wajibnumbermin 0 · maks 1
fields[].h wajibnumbermin 0 · maks 1
fields[].is_requiredbooleanbawaan true
fields[].font_sizeintegerbawaan 12
fields[].validationstringsalah satu: "none", "email", "number", "date"
fields[].auto_fillstringsalah satu: "none", "name", "email", "date"
fields[].lockedbooleanNilai diisi pengirim dan dikunci
fields[].valuestring | nullmaks. 2000 karakter
fields[].choicesarray<string> | nullPilihan dropdown/radio; untuk lampiran: `[teks permintaan]`
fields[].namestringWajib untuk angka/rumus — pola ^[a-z][a-z0-9_]{0,31}$
fields[].formulastringUntuk ff_type=formula, mis. `harga * jumlah`
fields[].minnumber
fields[].maxnumber
fields[].conditionobject | nullTampilkan field hanya bila kondisi terpenuhi
fields[].idstring (uuid)
fields[].refstringmaks. 64 karakter

Respons

  • 200OK
  • 400Input tidak valid
  • 402Fitur di luar paket atau kuota habis

DELETE/form-fields/{id}

Hapus field

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /form-fields/{id}
NamaTipeKeterangan
id wajibstring (uuid) · path

Respons

  • 204Dihapus

Permintaan tanda tangan

Kirim dokumen ke penerima. Setiap pengiriman memakai 1 kuota dokumen bulanan organisasi.

POST/sign-requests/create-with-document-roles

Kirim dokumen untuk ditandatangani

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Membuat/memperbarui peran penerima lalu mengirim undangan ke tahap pertama. routing_stage > 1, Penyetuju, atau allow_delegation membutuhkan fitur routing_stages; field kondisional/angka/rumus logic_fields; stempel/lampiran stamp_attachments; OTP SMS sms_otp. Memakai 1 kuota dokumen (402 quota_exceeded bila habis). Memicu webhook sent.

Isi permintaan (application/json)

Isi permintaan /sign-requests/create-with-document-roles
NamaTipeKeterangan
document_id wajibstring (uuid)
titlestring
email_subjectstring
email_bodystring
has_queuebooleanUrutan lama: tahap 1..n mengikuti queue_position
allow_delegationboolean
reminders_enabledboolean
reminder_every_hoursintegermin 0
sender_receives_final_copybooleanbawaan true
expires_in_daysnumbermaks 3650
document_roles wajibarray<object>maks. 50 item
document_roles[].namestringmaks. 254 karakter
document_roles[].emailstring (email)maks. 254 karakter
document_roles[].signer_typestringsigner = Penanda tangan, approver = Penyetuju, viewer/cc = Peninjau (tembusan) — salah satu: "signer", "approver", "viewer", "cc"
document_roles[].queue_positioninteger
document_roles[].routing_stageintegermin 1 · maks 50
document_roles[].is_enabledboolean
document_roles[].require_verificationbooleanWajib OTP
document_roles[].otp_channelstringsalah satu: "email", "sms"
document_roles[].phonestringUntuk OTP SMS (E.164, mis. +6281234567890)
document_roles[].require_idbooleanWajib verifikasi identitas
document_roles[].access_codestring | nullKode akses; tidak pernah dikembalikan — maks. 100 karakter
document_roles[].receives_final_copyboolean
document_roles[].badge_colorstring
document_roles[].idstring (uuid)Peran yang sudah ada (field tetap tertaut)

Respons

  • 201Terkirim
  • 400Input tidak valid
  • 402Fitur di luar paket atau kuota habis
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

POST/sign-requests/{id}/void

Batalkan permintaan tanda tangan

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /sign-requests/{id}/void
NamaTipeKeterangan
id wajibstring (uuid) · path

Isi permintaan (application/json)

Isi permintaan /sign-requests/{id}/void
NamaTipeKeterangan
reasonstring

Respons

  • 200OK
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)
  • 409Status tidak mengizinkan aksi ini

POST/sign-requests/signers/{signerId}/reassign

Ganti penanda tangan yang belum menandatangani

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Tautan lama berhenti berlaku; penerima baru menerima undangan.

Parameter

Parameter /sign-requests/signers/{signerId}/reassign
NamaTipeKeterangan
signerId wajibstring (uuid) · path

Isi permintaan (application/json)

Isi permintaan /sign-requests/signers/{signerId}/reassign
NamaTipeKeterangan
email wajibstring (email)maks. 254 karakter
namestringmaks. 200 karakter

Respons

  • 200OK
  • 409Status tidak mengizinkan aksi ini

Audit

Jejak audit lengkap dokumen. Token penanda tangan, hash kode, dan berkas identitas tidak pernah dikembalikan.

GET/audit/{documentId}

Jejak audit dokumen

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /audit/{documentId}
NamaTipeKeterangan
documentId wajibstring (uuid) · path

Respons

  • 200OK
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

Integrasi

API key dan webhook organisasi. Webhook dikelola Pemilik/Admin; membuat API key hanya lewat sesi browser.

GET/integrations/api-keys

Daftar API key (Anggota: miliknya; Admin: seluruh organisasi)

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Respons

  • 200OK

DELETE/integrations/api-keys/{id}

Cabut API key

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /integrations/api-keys/{id}
NamaTipeKeterangan
id wajibstring (uuid) · path

Respons

  • 204Dicabut

GET/integrations/webhooks

Daftar webhook (Pemilik/Admin)

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Respons

  • 200OK

POST/integrations/webhooks

Tambah webhook (Pemilik/Admin)

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

URL harus alamat publik (diperiksa ulang saat pengiriman). Maksimal 25 webhook. secret HMAC hanya ditampilkan sekali.

Isi permintaan (application/json)

Isi permintaan /integrations/webhooks
NamaTipeKeterangan
url wajibstring (uri)maks. 2048 karakter
eventsarray<string>Kosong = semua event

Respons

  • 201Dibuat
  • 402Fitur di luar paket atau kuota habis

DELETE/integrations/webhooks/{id}

Hapus webhook

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Parameter

Parameter /integrations/webhooks/{id}
NamaTipeKeterangan
id wajibstring (uuid) · path

Respons

  • 204Dihapus

GET/integrations/webhooks/{id}/deliveries

50 pengiriman terakhir sebuah webhook

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

status: sent, failed, atau skipped_plan (organisasi tidak lagi memiliki fitur API & webhook; webhook tidak dihapus).

Parameter

Parameter /integrations/webhooks/{id}/deliveries
NamaTipeKeterangan
id wajibstring (uuid) · path

Respons

  • 200OK

Embed

Penandatanganan tersemat (iframe) untuk organisasi pelanggan mitra. URL berlaku 10 menit, sekali pakai, dan hanya dapat dibingkai oleh origin mitra yang disetujui.

POST/embed/sign-url

Buat URL penandatanganan tersemat

Header X-API-Key (juga tersedia di /partner-api dengan X-Partner-Key + X-Organization-Id untuk organisasi pelanggan mitra)

Hanya untuk organisasi pelanggan mitra (atau lewat /partner-api/embed/sign-url dengan X-Organization-Id). origin harus persis salah satu origin embed mitra yang disetujui (https://host[:port]); bawaan: origin dari return_url, atau satu-satunya origin yang disetujui. return_url harus memakai origin yang sama. URL berlaku 10 menit dan hanya dapat ditukar sekali; buat URL baru untuk setiap pemuatan iframe.

Isi permintaan (application/json)

Isi permintaan /embed/sign-url
NamaTipeKeterangan
sign_request_id wajibstring (uuid)
signer_email wajibstring (email)
originstring
return_urlstring (uri)

Respons

  • 201URL dibuat
  • 400Input tidak valid
  • 403Peran tidak mengizinkan, sesi browser diperlukan, atau mitra ditangguhkan
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)
  • 409Status tidak mengizinkan aksi ini

POST/embed/exchange

Tukar token embed (dipakai halaman tanda tangan)

Publik, tanpa kunci.

Dipanggil oleh sign.html?embed=…, bukan oleh server mitra. Sekali pakai; pemanggilan berikutnya, token kedaluwarsa, mitra ditangguhkan, atau origin yang dicabut menghasilkan 410 embed_unavailable.

Isi permintaan (application/json)

Isi permintaan /embed/exchange
NamaTipeKeterangan
token wajibstring

Respons

  • 200OK
  • 410Tidak lagi tersedia

Mitra

API OEM untuk mitra: buat organisasi pelanggan, pantau pemakaian, dan jalankan API dokumen atas nama organisasi pelanggan (header X-Organization-Id).

GET/partner-api/me

Profil mitra

Header X-Partner-Key

Respons

  • 200OK
  • 401Kredensial tidak ada atau tidak valid

GET/partner-api/organizations

Daftar organisasi pelanggan

Header X-Partner-Key

Parameter

Parameter /partner-api/organizations
NamaTipeKeterangan
qstring · queryCari nama atau external_id — maks. 120 karakter
pageinteger · querymin 1 · bawaan 1
page_sizeinteger · querymin 1 · maks 100 · bawaan 25
periodstring · queryBulan `YYYY-MM` (Asia/Jakarta); bawaan bulan berjalan — pola ^\d{4}-(0[1-9]|1[0-2])$

Respons

  • 200OK

POST/partner-api/organizations

Buat organisasi pelanggan

Header X-Partner-Key

Membuat organisasi dengan paket mitra (tanpa uji coba), akun layanan untuk API, dan undangan Pemilik yang dikirim langsung ke email pemilik (tautan undangan tidak pernah dikembalikan ke mitra). Maksimal 100 organisasi per 24 jam per mitra.

Isi permintaan (application/json)

Isi permintaan /partner-api/organizations
NamaTipeKeterangan
name wajibstringmaks. 120 karakter
owner_email wajibstring (email)maks. 254 karakter
external_idstringReferensi Anda sendiri; unik per mitra — pola ^[A-Za-z0-9._:-]{1,100}$

Respons

  • 201Dibuat
  • 400Input tidak valid
  • 401Kredensial tidak ada atau tidak valid
  • 403Peran tidak mengizinkan, sesi browser diperlukan, atau mitra ditangguhkan
  • 409Status tidak mengizinkan aksi ini
  • 429Batas 100 organisasi per 24 jam (`org_daily_limit`)

GET/partner-api/organizations/{id}

Detail organisasi pelanggan

Header X-Partner-Key

Parameter

Parameter /partner-api/organizations/{id}
NamaTipeKeterangan
id wajibstring (uuid) · path
periodstring · queryBulan `YYYY-MM` (Asia/Jakarta); bawaan bulan berjalan — pola ^\d{4}-(0[1-9]|1[0-2])$

Respons

  • 200OK
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

POST/partner-api/organizations/{id}/owner-invite

Kirim ulang undangan Pemilik

Header X-Partner-Key

Hanya selama organisasi belum memiliki Pemilik (409 owner_exists). Undangan lama dicabut.

Parameter

Parameter /partner-api/organizations/{id}/owner-invite
NamaTipeKeterangan
id wajibstring (uuid) · path

Isi permintaan (application/json)

Isi permintaan /partner-api/organizations/{id}/owner-invite
NamaTipeKeterangan
owner_emailstring (email)

Respons

  • 200OK
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)
  • 409Status tidak mengizinkan aksi ini

GET/partner-api/usage

Pemakaian dokumen per organisasi pelanggan

Header X-Partner-Key

Dokumen terkirim dalam periode (Asia/Jakarta), dasar tagihan partner_usage bulanan = dokumen × doc_price. Sertakan X-Organization-Id untuk satu organisasi.

Parameter

Parameter /partner-api/usage
NamaTipeKeterangan
periodstring · queryBulan `YYYY-MM` (Asia/Jakarta); bawaan bulan berjalan — pola ^\d{4}-(0[1-9]|1[0-2])$
X-Organization-Idstring (uuid) · header

Respons

  • 200OK

POST/partner-api/sign-requests/create-with-document-roles

Contoh: kirim dokumen atas nama organisasi pelanggan

Header X-Partner-Key

Sama dengan POST /sign-requests/create-with-document-roles, dengan header X-Partner-Key + X-Organization-Id. Pola yang sama berlaku untuk /partner-api/documents, /partner-api/document-roles, /partner-api/form-fields, /partner-api/sign-requests, /partner-api/audit, dan /partner-api/embed.

Parameter

Parameter /partner-api/sign-requests/create-with-document-roles
NamaTipeKeterangan
X-Organization-Id wajibstring (uuid) · headerId organisasi pelanggan milik mitra

Isi permintaan (application/json)

Isi permintaan /partner-api/sign-requests/create-with-document-roles
NamaTipeKeterangan
document_id wajibstring (uuid)
titlestring
email_subjectstring
email_bodystring
has_queuebooleanUrutan lama: tahap 1..n mengikuti queue_position
allow_delegationboolean
reminders_enabledboolean
reminder_every_hoursintegermin 0
sender_receives_final_copybooleanbawaan true
expires_in_daysnumbermaks 3650
document_roles wajibarray<object>maks. 50 item
document_roles[].namestringmaks. 254 karakter
document_roles[].emailstring (email)maks. 254 karakter
document_roles[].signer_typestringsigner = Penanda tangan, approver = Penyetuju, viewer/cc = Peninjau (tembusan) — salah satu: "signer", "approver", "viewer", "cc"
document_roles[].queue_positioninteger
document_roles[].routing_stageintegermin 1 · maks 50
document_roles[].is_enabledboolean
document_roles[].require_verificationbooleanWajib OTP
document_roles[].otp_channelstringsalah satu: "email", "sms"
document_roles[].phonestringUntuk OTP SMS (E.164, mis. +6281234567890)
document_roles[].require_idbooleanWajib verifikasi identitas
document_roles[].access_codestring | nullKode akses; tidak pernah dikembalikan — maks. 100 karakter
document_roles[].receives_final_copyboolean
document_roles[].badge_colorstring
document_roles[].idstring (uuid)Peran yang sudah ada (field tetap tertaut)

Respons

  • 201Terkirim (lihat sendDocument)
  • 403Peran tidak mengizinkan, sesi browser diperlukan, atau mitra ditangguhkan
  • 404Tidak ditemukan (juga untuk data milik organisasi lain)

Event webhook

Isi permintaan: {"event", "at", "data"}. Balas 2xx dalam 10 detik; pengiriman tidak diulang.

EVENTsent

Dokumen dikirim

Data event sent
NamaTipeKeterangan
data.document_idstring (uuid)
data.sign_request_idstring (uuid)
data.titlestring
data.signersarray<string>

EVENTcompleted

Semua pihak selesai; salinan final bersegel tersedia

Data event completed
NamaTipeKeterangan
data.document_idstring (uuid)
data.signed_hashstringSHA-256 PDF final

EVENTdeclined

Penerima menolak

Data event declined
NamaTipeKeterangan
data.document_idstring (uuid)
data.bystring (email)
data.reasonstring | null

EVENTvoided

Pengirim membatalkan dokumen

Data event voided
NamaTipeKeterangan
data.document_idstring (uuid)
data.reasonstring | null