Personal remittance account agreement: six languages; users must read it before submission
At POST /v1/remit/vp/applications submission, we store the agreement snapshot in the application and set agreed_at to the current instant, recording that the member agreed at that time. You must therefore show the complete agreement to the end user before submission and obtain explicit agreement.
Previously merchants had none of this text, maintained by us. That was a compliance gap, not a UX issue.
── Why it is not a hosted screen ── Reading an agreement is an informational step; redirecting away would interrupt account opening. The agreement should appear within your brand. We only require that we supply the text and control its version.
── Language fallback: lang may differ from your request ── Unconfigured languages fall back through en → zh-Hans. No machine translation is performed: an unreviewed translation is worse than displaying English, since we must honor decisions users make from it.
⚠ Clearly label an item supplied in English; do not present it as though it were Chinese.
intro, the account-opening introduction rather than the agreement, may be null if operations has not configured it. Its absence does not prevent account opening.
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
lang |
string | Optional | Requested language: zh-Hans / zh-Hant / en / fr / ja / ko. If omitted, use Accept-Language. |
Response
{
"agreement": {
"lang": "zh-Hans",
"title": "个人汇款账户服务协议",
"body": "第一条 …"
},
"intro": {
"lang": "zh-Hans",
"title": "关于个人汇款账户",
"body": "开通后,你的汇款将以你本人的名义汇出…"
}
}service_unavailable: agreement text has not been configured. Do not allow account opening: asking users to accept a blank agreement is equivalent to having no agreement. POST /v1/remit/vp/applications also rejects this situation.curl -X GET 'https://api.zinfra.vip/v1/remit/vp/agreement' \
-H 'x-auth-token: Bearer $TOKEN'const res = await fetch("https://api.zinfra.vip/v1/remit/vp/agreement", {
method: "GET",
headers: {
"x-auth-token": "Bearer $TOKEN",
},
});
// Keep monetary amounts as strings, never numbers.
const data = await res.json();import requests
res = requests.get(
"https://api.zinfra.vip/v1/remit/vp/agreement",
headers={
"x-auth-token": "Bearer $TOKEN",
},
)
# Use Decimal(str(...)) for amounts, not float.
data = res.json()req, _ := http.NewRequest("GET", "https://api.zinfra.vip/v1/remit/vp/agreement",
nil)
req.Header.Set("x-auth-token", "Bearer $TOKEN")
res, err := http.DefaultClient.Do(req)
// Decode amount fields as string, not float64.HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.zinfra.vip/v1/remit/vp/agreement"))
.header("x-auth-token", "Bearer $TOKEN")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
// Use String / BigDecimal for amounts, not double.$ch = curl_init('https://api.zinfra.vip/v1/remit/vp/agreement');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-auth-token: Bearer $TOKEN',
],
]);
$res = curl_exec($ch);
// Use bcmath / strings for amounts, not floatval.
{
"agreement": {
"lang": "zh-Hans",
"title": "个人汇款账户服务协议",
"body": "第一条 …"
},
"intro": {
"lang": "zh-Hans",
"title": "关于个人汇款账户",
"body": "开通后,你的汇款将以你本人的名义汇出…"
}
}