curl --request POST \
--url https://api.pid.peridotvault.com/v1/fiat/deposits/checkout \
--header 'Content-Type: application/json' \
--cookie pid_access= \
--data '
{
"netAmountIdr": "<string>",
"clientId": "<string>",
"paymentMethod": "<string>"
}
'const options = {
method: 'POST',
headers: {cookie: 'pid_access=', 'Content-Type': 'application/json'},
body: JSON.stringify({netAmountIdr: '<string>', clientId: '<string>', paymentMethod: '<string>'})
};
fetch('https://api.pid.peridotvault.com/v1/fiat/deposits/checkout', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.pid.peridotvault.com/v1/fiat/deposits/checkout"
payload = {
"netAmountIdr": "<string>",
"clientId": "<string>",
"paymentMethod": "<string>"
}
headers = {
"cookie": "pid_access=",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.pid.peridotvault.com/v1/fiat/deposits/checkout"
payload := strings.NewReader("{\n \"netAmountIdr\": \"<string>\",\n \"clientId\": \"<string>\",\n \"paymentMethod\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "pid_access=")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "<string>",
"providerRef": "<string>",
"paymentUrl": "<string>",
"tokenId": "<string>",
"grossIdr": "<string>",
"feeIdr": "<string>",
"netIdr": "<string>",
"feePolicyVersion": 123,
"providerStatus": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"expiredDate": "<string>",
"totalIdr": "<string>",
"appFeeIdr": "<string>",
"gatewayFeeIdr": "<string>",
"transferFeeIdr": "<string>",
"paymentMethod": "<string>"
}{
"statusCode": 400,
"message": [
"handle must be 3-20 chars: lowercase letters, numbers, underscore"
]
}{
"statusCode": 401,
"message": "Unauthorized"
}Create a Checkout deposit intent (DOKU-hosted page, all channels)
netAmountIdr is the NET credited to the user (minimum Rp50.000,
API-enforced — no DOKU minimum). Total payable = net + PeridotID fee
(0.1% min Rp100 no cap; Rp0 for verified apps) + the app’s stacked fee
(when clientId is given) + the selected method’s DOKU gateway fee.
All quotes are snapshotted on the row. paymentMethod is a category key
(VIRTUAL_ACCOUNT/EWALLET/CARD/QRIS) or a specific DOKU code; it locks
payment_method_types at DOKU. Omit it to let DOKU show all channels
(no gateway fee added). Quote first via POST /fiat/deposits/quote.
curl --request POST \
--url https://api.pid.peridotvault.com/v1/fiat/deposits/checkout \
--header 'Content-Type: application/json' \
--cookie pid_access= \
--data '
{
"netAmountIdr": "<string>",
"clientId": "<string>",
"paymentMethod": "<string>"
}
'const options = {
method: 'POST',
headers: {cookie: 'pid_access=', 'Content-Type': 'application/json'},
body: JSON.stringify({netAmountIdr: '<string>', clientId: '<string>', paymentMethod: '<string>'})
};
fetch('https://api.pid.peridotvault.com/v1/fiat/deposits/checkout', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.pid.peridotvault.com/v1/fiat/deposits/checkout"
payload = {
"netAmountIdr": "<string>",
"clientId": "<string>",
"paymentMethod": "<string>"
}
headers = {
"cookie": "pid_access=",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.pid.peridotvault.com/v1/fiat/deposits/checkout"
payload := strings.NewReader("{\n \"netAmountIdr\": \"<string>\",\n \"clientId\": \"<string>\",\n \"paymentMethod\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "pid_access=")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "<string>",
"providerRef": "<string>",
"paymentUrl": "<string>",
"tokenId": "<string>",
"grossIdr": "<string>",
"feeIdr": "<string>",
"netIdr": "<string>",
"feePolicyVersion": 123,
"providerStatus": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"expiredDate": "<string>",
"totalIdr": "<string>",
"appFeeIdr": "<string>",
"gatewayFeeIdr": "<string>",
"transferFeeIdr": "<string>",
"paymentMethod": "<string>"
}{
"statusCode": 400,
"message": [
"handle must be 3-20 chars: lowercase letters, numbers, underscore"
]
}{
"statusCode": 401,
"message": "Unauthorized"
}Authorizations
JWT access token set by /auth/google/callback or /auth/refresh
Body
Response
Checkout deposit intent
Invoice number at DOKU (idempotency key)
DOKU-hosted payment page (all banks, QRIS, e-money, cards)
Total payable at DOKU (net + PeridotID fee + app fee + gateway fee)
PeridotID fee (Rp0 for verified apps)
Net credited to the user (the entered amount)
Same as grossIdr (Total Payment)
The initiating app's own stacked fee (0 when no app context)
DOKU payment-gateway fee for the selected method
Combined display line — PeridotID fee+PPN + DOKU gateway fee+PPN
Selected category key or DOKU method code