REST API tanda tangan elektronik ttdHUB: dokumen, penerima, field, permintaan tanda tangan, jejak audit, webhook, penandatanganan tersemat, dan API mitra.
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.
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
Nama
Tipe
Keterangan
q
string · query
Cari judul — maks. 200 karakter
status
string · query
salah satu: "draft", "sent", "completed", "voided", "declined", "expired"
folder_id
string (uuid) · query
scope
string · query
`mine` = hanya dokumen milik pemanggil — salah satu: "mine", "team"
limit
integer · query
min 1 · maks 200 · bawaan 100
offset
integer · query
min 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
Nama
Tipe
Keterangan
filewajib
string (binary)
Berkas PDF (application/pdf)
title
string
Judul; 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
Nama
Tipe
Keterangan
urlwajib
string (uri)
maks. 2048 karakter
title
string
maks. 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}
Nama
Tipe
Keterangan
idwajib
string (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}
Nama
Tipe
Keterangan
idwajib
string (uuid) · path
Isi permintaan (application/json)
Isi permintaan /documents/{id}
Nama
Tipe
Keterangan
folder_id
string | null (uuid)
title
string
maks. 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
Nama
Tipe
Keterangan
idwajib
string (uuid) · path
signed
string · query
salah satu: "1"
raw
string · query
Tanpa 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
Nama
Tipe
Keterangan
idwajib
string (uuid) · path
Isi permintaan (application/json)
Isi permintaan /documents/{id}/void
Nama
Tipe
Keterangan
reason
string
maks. 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)
Pilihan dropdown/radio; untuk lampiran: `[teks permintaan]`
name
string
Wajib untuk angka/rumus — pola ^[a-z][a-z0-9_]{0,31}$
formula
string
Untuk ff_type=formula, mis. `harga * jumlah`
min
number
max
number
condition
object | null
Tampilkan field hanya bila kondisi terpenuhi
condition.field_idwajib
string
Id field pengendali (atau `ref` dalam batch)
condition.opwajib
string
salah satu: "checked", "unchecked", "equals", "not_equals", "not_empty"
condition.value
string | 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.
Pilihan dropdown/radio; untuk lampiran: `[teks permintaan]`
fields[].name
string
Wajib untuk angka/rumus — pola ^[a-z][a-z0-9_]{0,31}$
fields[].formula
string
Untuk ff_type=formula, mis. `harga * jumlah`
fields[].min
number
fields[].max
number
fields[].condition
object | null
Tampilkan field hanya bila kondisi terpenuhi
fields[].id
string (uuid)
fields[].ref
string
maks. 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}
Nama
Tipe
Keterangan
idwajib
string (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.
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}
Nama
Tipe
Keterangan
documentIdwajib
string (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}
Nama
Tipe
Keterangan
idwajib
string (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
Nama
Tipe
Keterangan
urlwajib
string (uri)
maks. 2048 karakter
events
array<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}
Nama
Tipe
Keterangan
idwajib
string (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
Nama
Tipe
Keterangan
idwajib
string (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
Nama
Tipe
Keterangan
sign_request_idwajib
string (uuid)
signer_emailwajib
string (email)
origin
string
return_url
string (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
Nama
Tipe
Keterangan
tokenwajib
string
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
Nama
Tipe
Keterangan
q
string · query
Cari nama atau external_id — maks. 120 karakter
page
integer · query
min 1 · bawaan 1
page_size
integer · query
min 1 · maks 100 · bawaan 25
period
string · query
Bulan `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
Nama
Tipe
Keterangan
namewajib
string
maks. 120 karakter
owner_emailwajib
string (email)
maks. 254 karakter
external_id
string
Referensi 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}
Nama
Tipe
Keterangan
idwajib
string (uuid) · path
period
string · query
Bulan `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.
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
Nama
Tipe
Keterangan
period
string · query
Bulan `YYYY-MM` (Asia/Jakarta); bawaan bulan berjalan — pola ^\d{4}-(0[1-9]|1[0-2])$
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.