Project

General

Profile

Onboarding Foreign API Spc » History » Version 12

nanon buaphet, 03/06/2026 08:00 AM

1 1 Ryan Supawarapong
# Onboarding Foreign API Spc
2
3 4 Ryan Supawarapong
## 1. Pre-Create (Fullname)
4 2 Ryan Supawarapong
5
| Type | Value |
6 1 Ryan Supawarapong
|---|---|
7 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/individual/ico/precreate` |
8 2 Ryan Supawarapong
| Request Type | `POST` |
9
| Content-Type | `application/json` |
10 1 Ryan Supawarapong
11
### Request Body
12
13 2 Ryan Supawarapong
| Key | Type | Example | Required |
14
|---|---|---|---|
15
| title | string | `"Mr."` | yes |
16
| name | string | `"John"` | yes |
17 1 Ryan Supawarapong
| surname | string | `"Doe"` | yes |
18 2 Ryan Supawarapong
| email | string | `"john@doe.com"` | yes |
19
| mobile | string | `"0987654321"` | yes |
20 4 Ryan Supawarapong
| birthDate | string (ISO 8601) | `"1990-01-01T00:00:00Z"` | yes |
21 2 Ryan Supawarapong
| marriageStatus | string | `"Single"` | yes |
22
| nationality | string | `"USA"` | yes |
23
| passportNumber | string | `"AC123435"` | yes |
24 4 Ryan Supawarapong
| expirationDate | string (ISO 8601) | `"2030-01-01T00:00:00Z"` | yes |
25 2 Ryan Supawarapong
| agreement | boolean | `true` | yes |
26 1 Ryan Supawarapong
27
### Success Response (200)
28
29 2 Ryan Supawarapong
| JSON Path | Type | Example | Required |
30
|---|---|---|---|
31
| status | string | `"success"` | yes |
32 4 Ryan Supawarapong
| data | object | `{"registerId":"..."}` | yes |
33
| data.registerId | string | `"registerId"` | no (`omitempty`) |
34 1 Ryan Supawarapong
| data.alreadyExist | boolean | `true` | no (`omitempty`) |
35
| xid | string | `"xRequestId"` | yes |
36
37
### Error Response
38
39 4 Ryan Supawarapong
#### Bad Request (400) — bind/validate/usecase error
40
| JSON Path | Type | Example | Required |
41
|---|---|---|---|
42
| status | string | `"failed"` or `"error"` | yes |
43
| message | string | `"error message"` | no |
44
| data | object | `{"errors":[...]}` | no (validation) |
45
| xid | string | `"xRequestId"` | yes |
46
47
---
48
49
## 2. Back to Register
50
51
| Type | Value |
52
|---|---|
53 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/individual/ico/backregister` |
54 4 Ryan Supawarapong
| Request Type | `POST` |
55
| Content-Type | `application/json` |
56
57
### Request Body
58
59
| Key | Type | Example | Required |
60
|---|---|---|---|
61 7 Ryan Supawarapong
| passportNumber | string | `"AC1234"` | yes |
62 4 Ryan Supawarapong
63
### Success Response (200)
64
65
| JSON Path | Type | Example | Required |
66
|---|---|---|---|
67
| response | object | existing customer info object | yes |
68
| xid | string | `"xRequestId"` | yes |
69
70
### Error Response
71
72 1 Ryan Supawarapong
#### Bad Request (400)
73
| JSON Path | Type | Example | Required |
74
|---|---|---|---|
75 4 Ryan Supawarapong
| message | string | `"error message"` | yes |
76
| xid | string | `"xRequestId"` | yes |
77 1 Ryan Supawarapong
78 4 Ryan Supawarapong
---
79
80
## 3. Init Appman
81
82
| Type | Value |
83
|---|---|
84 11 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/appman/init` |
85 4 Ryan Supawarapong
| Request Type | `GET` |
86
| Content-Type | `application/json` |
87
88
### Query Parameters
89
90
| Key | Type | Example | Required |
91
|---|---|---|---|
92
| registerId | string | `"registerId-12345"` | yes |
93
94
### Request Body
95
96
| Key | Type | Example | Required |
97
|---|---|---|---|
98
| - | - | - | no body |
99
100
### Success Response (200)
101
102 1 Ryan Supawarapong
| JSON Path | Type | Example | Required |
103
|---|---|---|---|
104 4 Ryan Supawarapong
| redirect_url | string | `"https://appman.test"` | yes |
105
| xid | string | `"xRequestID"` | yes |
106
107
### Error Response
108
109
#### Bad Request (400)
110
| JSON Path | Type | Example | Required |
111
|---|---|---|---|
112
| message | string | `"registerId is required"` | yes |
113
| xid | string | `"xRequestId"` | yes |
114
115
---
116 1 Ryan Supawarapong
117 8 Ryan Supawarapong
## 4) Get Result Appman
118
119 4 Ryan Supawarapong
| Type | Value |
120 1 Ryan Supawarapong
|---|---|
121 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/appman/result` |
122 8 Ryan Supawarapong
| Method | `POST` |
123 4 Ryan Supawarapong
| Content-Type | `application/json` |
124 1 Ryan Supawarapong
125 9 Ryan Supawarapong
### Request Parameter
126 1 Ryan Supawarapong
127 8 Ryan Supawarapong
| Key | Type | Required |
128
|---|---|---|
129
| verifyid | string | yes | 
130
| verified | boolean | no |
131
| isSkipAmlo | boolean | no | 
132
| isSkipPep | boolean | no | 
133
| isSkipLed | boolean | no | 
134
| isSkipDopa | boolean | no | 
135
| isMobile | boolean | no |
136 1 Ryan Supawarapong
137 8 Ryan Supawarapong
### Success (200)
138
139
| JSON Path | Type | Required |
140
|---|---|---|
141
| response | string | yes |
142
| xid | string | yes |
143
144
### Error (400)
145
146
| JSON Path | Type | Required |
147
|---|---|---|
148
| message | string | yes |
149
| xid | string | yes |
150 4 Ryan Supawarapong
151 6 Ryan Supawarapong
***
152
153 4 Ryan Supawarapong
## 5. Submit CRS
154
155
| Type | Value |
156
|---|---|
157 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/individual/ico/crs` |
158 4 Ryan Supawarapong
| Request Type | `POST` |
159
| Content-Type | `application/json` |
160
161
### Request Body
162
163
| Key | Type | Example | Required |
164
|---|---|---|---|
165
| registerId | string | `"registerId"` | yes |
166
| crs | array\<object\> | `[{"member_id":"...","is_tax_not_usa":true,...}]` | yes |
167
| crs[].member_id | string | `"member-001"` | no |
168
| crs[].is_tax_not_usa | boolean | `true` | no |
169
| crs[].country_tax_residence | string | `"US"` | no |
170
| crs[].is_tin | boolean | `true` | no |
171
| crs[].tin | string | `"123456789"` | no |
172
173
### Success Response (200)
174
175
| JSON Path | Type | Example | Required |
176
|---|---|---|---|
177
| xid | string | `"xRequestId"` | yes |
178
179
### Error Response
180
181
#### Bad Request (400)
182
| JSON Path | Type | Example | Required |
183
|---|---|---|---|
184
| message | string | `"error message"` | yes |
185
| xid | string | `"xRequestId"` | yes |
186
187
---
188
189
## 6. Post-Create (Basic Info — Create)
190
191
| Type | Value |
192
|---|---|
193 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/individual/ico/postcreate` |
194 4 Ryan Supawarapong
| Request Type | `POST` |
195
| Content-Type | `application/json` |
196
197
### Request Body
198
199
| Key | Type | Example | Required |
200
|---|---|---|---|
201
| registerId | string | `"registerId"` | yes |
202
| addresses | array\<object\> | see below | no |
203
| addresses[].homeNumber | string | `"homeNumber"` | yes |
204
| addresses[].villageNumber | string | `"homeAddress"` | no |
205
| addresses[].villageName | string | `"villageName"` | no |
206
| addresses[].subStreetName | string | `"subStreetName"` | no |
207
| addresses[].streetName | string | `"homeAddress"` | no |
208
| addresses[].subDistrictName | string | `"ตลาดยอด"` | yes |
209
| addresses[].districtName | string | `"เขตมีนบุรี"` | yes |
210
| addresses[].provinceName | string | `"ตราด"` | yes |
211
| addresses[].zipCode | string | `"10400"` | yes |
212
| addresses[].countryName | string | `"หมู่เกาะอะแลนด์"` | yes |
213
| addresses[].types | number | `1` | yes |
214
| occupation | object | see below | no |
215
| occupation.education | string | `"2"` | no |
216
| occupation.sourceOfIncome | string | `"3"` | no |
217
| occupation.currentOccupation | string | `"4"` | no |
218
| occupation.officeName | string | `"tisco"` | no |
219
| occupation.typeOfBusiness | string | `"6"` | no |
220
| occupation.positionName | string | `"tisco"` | no |
221
| occupation.salaryRange | string | `"3"` | no |
222
| banks | array\<object\> | see below | no |
223
| banks[].bankName | string | `"ธนาคารไทยพาณิชย์"` | no |
224
| banks[].bankBranchName | string | `"ธนาคารไทยพาณิชย์"` | no |
225
| banks[].bankAccountNumber | string | `"12345"` | no |
226
| banks[].types | number | `1` | no |
227
| banks[].isDefault | boolean | `true` | no |
228
| investment | object | see below | no |
229
| investment.shortTermInvestment | boolean | `true` | no |
230
| investment.longTermInvestment | boolean | `false` | no |
231
| investment.taxesInvestment | boolean | `true` | no |
232
| investment.retireInvestment | boolean | `true` | no |
233 12 nanon buaphet
| step | number | `100` | yes |
234 4 Ryan Supawarapong
235
### Success Response (200)
236
237
| JSON Path | Type | Example | Required |
238
|---|---|---|---|
239
| registerId | string | `"registerId"` | yes |
240
| xid | string | `"xRequestId"` | yes |
241
242
### Error Response
243
244
#### Bad Request (400)
245
| JSON Path | Type | Example | Required |
246
|---|---|---|---|
247
| message | string | `"error message"` | yes |
248
| xid | string | `"xRequestId"` | yes |
249
250
---
251
252
## 7. Update Post (Basic Info — Edit)
253
254
| Type | Value |
255
|---|---|
256 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/individual/ico/update/post` |
257 4 Ryan Supawarapong
| Request Type | `POST` |
258
| Content-Type | `application/json` |
259
260
### Request Body
261
262
_Same as [6. Post-Create](#6-post-create-basic-info--create)._
263
264
### Success Response (200)
265
266
| JSON Path | Type | Example | Required |
267
|---|---|---|---|
268
| registerId | string | `"registerId"` | yes |
269
| xid | string | `"xRequestId"` | yes |
270
271
### Error Response
272
273
#### Bad Request (400)
274
| JSON Path | Type | Example | Required |
275
|---|---|---|---|
276
| message | string | `"error message"` | yes |
277
| xid | string | `"xRequestId"` | yes |
278
279
---
280
281
## 8. Suite Test — Save
282
283
| Type | Value |
284
|---|---|
285 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/suitetest/ico/result/individual/save` |
286 4 Ryan Supawarapong
| Request Type | `POST` |
287
| Content-Type | `application/json` |
288
289
### Request Body
290
291
| Key | Type | Example | Required |
292
|---|---|---|---|
293
| registerId | string | `"registerId"` | yes |
294
| suiteTestResult | object | see below | no |
295
| suiteTestResult.registerId | string | `"registerId"` | yes |
296
| suiteTestResult.investorTypeRisk | string | `"เสี่ยงปานกลางค่อนสูง"` | no |
297
| suiteTestResult.level | number | `3` | no |
298
| suiteTestResult.totalScore | number | `24` | no |
299
| suiteTestResult.suiteTestResult | object | `{"answer":{"0":{"ans":[0,1,0,0]},...}}` | no |
300
| isFatca | boolean | `true` | no |
301
| fatcaInfo | array\<number\> | `[1,0,1,0,1,0,1,0]` | no |
302
| isKnowLedgeDone | boolean | `true` | no |
303
| knowLedgeTestResult | number | `15` | no |
304
| pageId | number | `600` | no |
305
306
### Success Response (200)
307
308
| JSON Path | Type | Example | Required |
309
|---|---|---|---|
310
| xid | string | `"xRequestId"` | yes |
311
312
### Error Response
313
314
#### Bad Request (400)
315
| JSON Path | Type | Example | Required |
316
|---|---|---|---|
317
| message | string | `"error message"` | yes |
318
| xid | string | `"xRequestId"` | yes |
319
320
---
321
322
## 9. Suite Test — Edit
323
324
| Type | Value |
325
|---|---|
326 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/suitetest/ico/result/individual/edit` |
327 4 Ryan Supawarapong
| Request Type | `POST` |
328
| Content-Type | `application/json` |
329
330
### Request Body
331
332
_Same as [8. Suite Test — Save](#8-suite-test--save)._
333
334
### Success Response (200)
335
336
| JSON Path | Type | Example | Required |
337
|---|---|---|---|
338
| xid | string | `"xRequestId"` | yes |
339
340
### Error Response
341
342
#### Bad Request (400)
343
| JSON Path | Type | Example | Required |
344
|---|---|---|---|
345
| message | string | `"error message"` | yes |
346
| xid | string | `"xRequestId"` | yes |
347
348
---
349
350
## 10. Upload Onboarding Document
351
352
| Type | Value |
353
|---|---|
354 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/upload/onboarding` |
355 4 Ryan Supawarapong
| Request Type | `POST` |
356
| Content-Type | `multipart/form-data` |
357
358
### Request Body (form fields)
359
360
| Key | Type | Example | Required |
361
|---|---|---|---|
362
| register_id | string | `"register-id-123"` | yes |
363
| type | integer (enum) | `3` | yes |
364
| doc_types | string (comma-separated) | `"country_origin_govt,proof_resident_thai"` | yes |
365
| files | file(s) | binary | yes |
366
367
**`type` enum values:**
368
369
| Value | Meaning | Allowed `doc_types` |
370
|---|---|---|
371
| `1` | Work Permit | `work_permit` |
372
| `2` | Visa | `visa_or_smart_visa` |
373
| `3` | Document by Origin Govt | `country_origin_govt`, `proof_resident_thai` |
374
| `4` | Document by Thai Govt | `proof_resident_thai` |
375
376
**Constraints:**
377
- Max 4 files per `doc_type` (types 1, 2, 4)
378
- Type 3 allows max 8 files total (up to 4 `country_origin_govt` + up to 4 `proof_resident_thai`)
379
- Max 10 MB per file, 80 MB total
380
- Number of `doc_types` values must match number of uploaded files
381
382
### Success Response (200)
383
384
| JSON Path | Type | Example | Required |
385
|---|---|---|---|
386
| status | string | `"success"` | yes |
387
| message | string | `"success"` | yes |
388
| xid | string | `"xRequestID"` | yes |
389
390
### Error Response
391
392
#### Bad Request (400) — validation error
393
| JSON Path | Type | Example | Required |
394
|---|---|---|---|
395
| status | string | `"failed"` or `"error"` | yes |
396
| message | string | `"files field is required"` | no |
397
| data | object | `{"error":"..."}` | no |
398
| xid | string | `"xRequestId"` | yes |
399
400
---
401
402
## 11. Verify Email (Send)
403
404
| Type | Value |
405
|---|---|
406 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/user/verify/email` |
407 4 Ryan Supawarapong
| Request Type | `POST` |
408
| Content-Type | `application/json` |
409
410
### Request Body
411
412
| Key | Type | Example | Required |
413
|---|---|---|---|
414
| registerId | string | `"register-id-123"` | no |
415
| tokenId | string | `"token-id-123"` | yes |
416
417
### Success Response (200)
418
419
| JSON Path | Type | Example | Required |
420
|---|---|---|---|
421
| xid | string | `"xRequestID"` | yes |
422
423
### Error Response
424
425
#### Bad Request (400)
426
| JSON Path | Type | Example | Required |
427
|---|---|---|---|
428
| message | string | `"verify email failed"` | yes |
429
| xid | string | `"xRequestId"` | yes |
430
431
---
432
433
## 12. Confirm Email (Check)
434
435
| Type | Value |
436
|---|---|
437 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/user/verify/email/check` |
438 4 Ryan Supawarapong
| Request Type | `GET` |
439
| Content-Type | `application/json` |
440
441
### Query Parameters
442
443
| Key | Type | Example | Required |
444
|---|---|---|---|
445
| token | string | `"token-id-123"` | yes |
446
| code | string | `"register-id-123"` | yes |
447
448
### Request Body
449
450
| Key | Type | Example | Required |
451
|---|---|---|---|
452
| - | - | - | no body |
453
454
### Success Response (200)
455
456
| JSON Path | Type | Example | Required |
457
|---|---|---|---|
458
| data | string | `"confirmed"` | yes |
459
| xid | string | `"xRequestId"` | yes |
460
461
### Error Response
462
463
#### Bad Request (400)
464
| JSON Path | Type | Example | Required |
465
|---|---|---|---|
466
| message | string | `"error message"` | yes |
467
| xid | string | `"xRequestId"` | yes |
468
469
---
470
471
## 13. Mobile Verify (Send OTP)
472
473
| Type | Value |
474
|---|---|
475 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/user/verify/mobile` |
476 4 Ryan Supawarapong
| Request Type | `POST` |
477
| Content-Type | `application/json` |
478
479
### Request Body
480
481
| Key | Type | Example | Required |
482
|---|---|---|---|
483
| registerId | string | `"registerId"` | yes |
484
| referenceCode | string | `"REF123"` | no |
485
| otp | string | `"123456"` | no |
486
| mobile | string | `"0987654321"` | no |
487
| isUpdate | boolean | `false` | no |
488
| pageId | number | `1600` | no |
489
490
### Success Response (200)
491
492
| JSON Path | Type | Example | Required |
493
|---|---|---|---|
494
| reference | string | `"AB1234"` | yes |
495
| xid | string | `"xRequestID"` | yes |
496
497
### Error Response
498
499
#### Bad Request (400)
500
| JSON Path | Type | Example | Required |
501
|---|---|---|---|
502
| message | string | `"error message"` | yes |
503
| xid | string | `"xRequestId"` | yes |
504
505
---
506
507
## 14. Confirm Mobile (Verify OTP)
508
509
| Type | Value |
510
|---|---|
511 10 Ryan Supawarapong
| API Path | `/api/v1/onboarding/foreign/user/verify/mobile/check` |
512 4 Ryan Supawarapong
| Request Type | `POST` |
513
| Content-Type | `application/json` |
514
515
### Request Body
516
517
| Key | Type | Example | Required |
518
|---|---|---|---|
519
| registerId | string | `"registerId"` | yes |
520
| referenceCode | string | `"AB1234"` | no |
521
| otp | string | `"123456"` | no |
522
| mobile | string | `"0987654321"` | no |
523
| isUpdate | boolean | `false` | no |
524
| pageId | number | `1600` | no |
525
526
### Success Response (200)
527
528
| JSON Path | Type | Example | Required |
529
|---|---|---|---|
530
| xid | string | `"xRequestId"` | yes |
531
532
### Error Response
533
534
#### Bad Request (400)
535
| JSON Path | Type | Example | Required |
536
|---|---|---|---|
537
| message | string | `"error message"` | yes |
538
| xid | string | `"xRequestId"` | yes |