Project

General

Profile

Onboarding Foreign API Spc » History » Version 7

Ryan Supawarapong, 03/05/2026 02:52 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 2 Ryan Supawarapong
| API Path | `/api/v1/foreign/individual/ico/precreate` |
8
| 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
| API Path | `/api/v1/foreign/individual/ico/backregister` |
54
| 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
| API Path | `/api/v1/foreign/appman/init/:registerId` |
85
| 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
117
## 4. Get Result Appman
118
119
| Type | Value |
120
|---|---|
121
| API Path | `/api/v1/foreign/appman/result` |
122
| Request Type | `POST` |
123
| Content-Type | `application/json` |
124
125
### Request Body
126
127
_Not yet implemented._
128
129 5 Ryan Supawarapong
### Response
130 4 Ryan Supawarapong
131 6 Ryan Supawarapong
***
132
133 4 Ryan Supawarapong
## 5. Submit CRS
134
135
| Type | Value |
136
|---|---|
137
| API Path | `/api/v1/foreign/individual/ico/crs` |
138
| Request Type | `POST` |
139
| Content-Type | `application/json` |
140
141
### Request Body
142
143
| Key | Type | Example | Required |
144
|---|---|---|---|
145
| registerId | string | `"registerId"` | yes |
146
| crs | array\<object\> | `[{"member_id":"...","is_tax_not_usa":true,...}]` | yes |
147
| crs[].member_id | string | `"member-001"` | no |
148
| crs[].is_tax_not_usa | boolean | `true` | no |
149
| crs[].country_tax_residence | string | `"US"` | no |
150
| crs[].is_tin | boolean | `true` | no |
151
| crs[].tin | string | `"123456789"` | no |
152
153
### Success Response (200)
154
155
| JSON Path | Type | Example | Required |
156
|---|---|---|---|
157
| xid | string | `"xRequestId"` | yes |
158
159
### Error Response
160
161
#### Bad Request (400)
162
| JSON Path | Type | Example | Required |
163
|---|---|---|---|
164
| message | string | `"error message"` | yes |
165
| xid | string | `"xRequestId"` | yes |
166
167
---
168
169
## 6. Post-Create (Basic Info — Create)
170
171
| Type | Value |
172
|---|---|
173
| API Path | `/api/v1/foreign/individual/ico/postcreate` |
174
| Request Type | `POST` |
175
| Content-Type | `application/json` |
176
177
### Request Body
178
179
| Key | Type | Example | Required |
180
|---|---|---|---|
181
| registerId | string | `"registerId"` | yes |
182
| addresses | array\<object\> | see below | no |
183
| addresses[].homeNumber | string | `"homeNumber"` | yes |
184
| addresses[].villageNumber | string | `"homeAddress"` | no |
185
| addresses[].villageName | string | `"villageName"` | no |
186
| addresses[].subStreetName | string | `"subStreetName"` | no |
187
| addresses[].streetName | string | `"homeAddress"` | no |
188
| addresses[].subDistrictName | string | `"ตลาดยอด"` | yes |
189
| addresses[].districtName | string | `"เขตมีนบุรี"` | yes |
190
| addresses[].provinceName | string | `"ตราด"` | yes |
191
| addresses[].zipCode | string | `"10400"` | yes |
192
| addresses[].countryName | string | `"หมู่เกาะอะแลนด์"` | yes |
193
| addresses[].types | number | `1` | yes |
194
| occupation | object | see below | no |
195
| occupation.education | string | `"2"` | no |
196
| occupation.sourceOfIncome | string | `"3"` | no |
197
| occupation.currentOccupation | string | `"4"` | no |
198
| occupation.officeName | string | `"tisco"` | no |
199
| occupation.typeOfBusiness | string | `"6"` | no |
200
| occupation.positionName | string | `"tisco"` | no |
201
| occupation.salaryRange | string | `"3"` | no |
202
| banks | array\<object\> | see below | no |
203
| banks[].bankName | string | `"ธนาคารไทยพาณิชย์"` | no |
204
| banks[].bankBranchName | string | `"ธนาคารไทยพาณิชย์"` | no |
205
| banks[].bankAccountNumber | string | `"12345"` | no |
206
| banks[].types | number | `1` | no |
207
| banks[].isDefault | boolean | `true` | no |
208
| investment | object | see below | no |
209
| investment.shortTermInvestment | boolean | `true` | no |
210
| investment.longTermInvestment | boolean | `false` | no |
211
| investment.taxesInvestment | boolean | `true` | no |
212
| investment.retireInvestment | boolean | `true` | no |
213
| pageID | number | `100` | yes |
214
215
### Success Response (200)
216
217
| JSON Path | Type | Example | Required |
218
|---|---|---|---|
219
| registerId | string | `"registerId"` | yes |
220
| xid | string | `"xRequestId"` | yes |
221
222
### Error Response
223
224
#### Bad Request (400)
225
| JSON Path | Type | Example | Required |
226
|---|---|---|---|
227
| message | string | `"error message"` | yes |
228
| xid | string | `"xRequestId"` | yes |
229
230
---
231
232
## 7. Update Post (Basic Info — Edit)
233
234
| Type | Value |
235
|---|---|
236
| API Path | `/api/v1/foreign/individual/ico/update/post` |
237
| Request Type | `POST` |
238
| Content-Type | `application/json` |
239
240
### Request Body
241
242
_Same as [6. Post-Create](#6-post-create-basic-info--create)._
243
244
### Success Response (200)
245
246
| JSON Path | Type | Example | Required |
247
|---|---|---|---|
248
| registerId | string | `"registerId"` | yes |
249
| xid | string | `"xRequestId"` | yes |
250
251
### Error Response
252
253
#### Bad Request (400)
254
| JSON Path | Type | Example | Required |
255
|---|---|---|---|
256
| message | string | `"error message"` | yes |
257
| xid | string | `"xRequestId"` | yes |
258
259
---
260
261
## 8. Suite Test — Save
262
263
| Type | Value |
264
|---|---|
265
| API Path | `/api/v1/foreign/suitetest/ico/result/individual/save` |
266
| Request Type | `POST` |
267
| Content-Type | `application/json` |
268
269
### Request Body
270
271
| Key | Type | Example | Required |
272
|---|---|---|---|
273
| registerId | string | `"registerId"` | yes |
274
| suiteTestResult | object | see below | no |
275
| suiteTestResult.registerId | string | `"registerId"` | yes |
276
| suiteTestResult.investorTypeRisk | string | `"เสี่ยงปานกลางค่อนสูง"` | no |
277
| suiteTestResult.level | number | `3` | no |
278
| suiteTestResult.totalScore | number | `24` | no |
279
| suiteTestResult.suiteTestResult | object | `{"answer":{"0":{"ans":[0,1,0,0]},...}}` | no |
280
| isFatca | boolean | `true` | no |
281
| fatcaInfo | array\<number\> | `[1,0,1,0,1,0,1,0]` | no |
282
| isKnowLedgeDone | boolean | `true` | no |
283
| knowLedgeTestResult | number | `15` | no |
284
| pageId | number | `600` | no |
285
286
### Success Response (200)
287
288
| JSON Path | Type | Example | Required |
289
|---|---|---|---|
290
| xid | string | `"xRequestId"` | yes |
291
292
### Error Response
293
294
#### Bad Request (400)
295
| JSON Path | Type | Example | Required |
296
|---|---|---|---|
297
| message | string | `"error message"` | yes |
298
| xid | string | `"xRequestId"` | yes |
299
300
---
301
302
## 9. Suite Test — Edit
303
304
| Type | Value |
305
|---|---|
306
| API Path | `/api/v1/foreign/suitetest/ico/result/individual/edit` |
307
| Request Type | `POST` |
308
| Content-Type | `application/json` |
309
310
### Request Body
311
312
_Same as [8. Suite Test — Save](#8-suite-test--save)._
313
314
### Success Response (200)
315
316
| JSON Path | Type | Example | Required |
317
|---|---|---|---|
318
| xid | string | `"xRequestId"` | yes |
319
320
### Error Response
321
322
#### Bad Request (400)
323
| JSON Path | Type | Example | Required |
324
|---|---|---|---|
325
| message | string | `"error message"` | yes |
326
| xid | string | `"xRequestId"` | yes |
327
328
---
329
330
## 10. Upload Onboarding Document
331
332
| Type | Value |
333
|---|---|
334
| API Path | `/api/v1/foreign/upload/onboarding` |
335
| Request Type | `POST` |
336
| Content-Type | `multipart/form-data` |
337
338
### Request Body (form fields)
339
340
| Key | Type | Example | Required |
341
|---|---|---|---|
342
| register_id | string | `"register-id-123"` | yes |
343
| type | integer (enum) | `3` | yes |
344
| doc_types | string (comma-separated) | `"country_origin_govt,proof_resident_thai"` | yes |
345
| files | file(s) | binary | yes |
346
347
**`type` enum values:**
348
349
| Value | Meaning | Allowed `doc_types` |
350
|---|---|---|
351
| `1` | Work Permit | `work_permit` |
352
| `2` | Visa | `visa_or_smart_visa` |
353
| `3` | Document by Origin Govt | `country_origin_govt`, `proof_resident_thai` |
354
| `4` | Document by Thai Govt | `proof_resident_thai` |
355
356
**Constraints:**
357
- Max 4 files per `doc_type` (types 1, 2, 4)
358
- Type 3 allows max 8 files total (up to 4 `country_origin_govt` + up to 4 `proof_resident_thai`)
359
- Max 10 MB per file, 80 MB total
360
- Number of `doc_types` values must match number of uploaded files
361
362
### Success Response (200)
363
364
| JSON Path | Type | Example | Required |
365
|---|---|---|---|
366
| status | string | `"success"` | yes |
367
| message | string | `"success"` | yes |
368
| xid | string | `"xRequestID"` | yes |
369
370
### Error Response
371
372
#### Bad Request (400) — validation error
373
| JSON Path | Type | Example | Required |
374
|---|---|---|---|
375
| status | string | `"failed"` or `"error"` | yes |
376
| message | string | `"files field is required"` | no |
377
| data | object | `{"error":"..."}` | no |
378
| xid | string | `"xRequestId"` | yes |
379
380
---
381
382
## 11. Verify Email (Send)
383
384
| Type | Value |
385
|---|---|
386
| API Path | `/api/v1/foreign/user/verify/email` |
387
| Request Type | `POST` |
388
| Content-Type | `application/json` |
389
390
### Request Body
391
392
| Key | Type | Example | Required |
393
|---|---|---|---|
394
| registerId | string | `"register-id-123"` | no |
395
| tokenId | string | `"token-id-123"` | yes |
396
397
### Success Response (200)
398
399
| JSON Path | Type | Example | Required |
400
|---|---|---|---|
401
| xid | string | `"xRequestID"` | yes |
402
403
### Error Response
404
405
#### Bad Request (400)
406
| JSON Path | Type | Example | Required |
407
|---|---|---|---|
408
| message | string | `"verify email failed"` | yes |
409
| xid | string | `"xRequestId"` | yes |
410
411
---
412
413
## 12. Confirm Email (Check)
414
415
| Type | Value |
416
|---|---|
417
| API Path | `/api/v1/foreign/user/verify/email/check` |
418
| Request Type | `GET` |
419
| Content-Type | `application/json` |
420
421
### Query Parameters
422
423
| Key | Type | Example | Required |
424
|---|---|---|---|
425
| token | string | `"token-id-123"` | yes |
426
| code | string | `"register-id-123"` | yes |
427
428
### Request Body
429
430
| Key | Type | Example | Required |
431
|---|---|---|---|
432
| - | - | - | no body |
433
434
### Success Response (200)
435
436
| JSON Path | Type | Example | Required |
437
|---|---|---|---|
438
| data | string | `"confirmed"` | yes |
439
| xid | string | `"xRequestId"` | yes |
440
441
### Error Response
442
443
#### Bad Request (400)
444
| JSON Path | Type | Example | Required |
445
|---|---|---|---|
446
| message | string | `"error message"` | yes |
447
| xid | string | `"xRequestId"` | yes |
448
449
---
450
451
## 13. Mobile Verify (Send OTP)
452
453
| Type | Value |
454
|---|---|
455
| API Path | `/api/v1/foreign/user/verify/mobile` |
456
| Request Type | `POST` |
457
| Content-Type | `application/json` |
458
459
### Request Body
460
461
| Key | Type | Example | Required |
462
|---|---|---|---|
463
| registerId | string | `"registerId"` | yes |
464
| referenceCode | string | `"REF123"` | no |
465
| otp | string | `"123456"` | no |
466
| mobile | string | `"0987654321"` | no |
467
| isUpdate | boolean | `false` | no |
468
| pageId | number | `1600` | no |
469
470
### Success Response (200)
471
472
| JSON Path | Type | Example | Required |
473
|---|---|---|---|
474
| reference | string | `"AB1234"` | yes |
475
| xid | string | `"xRequestID"` | yes |
476
477
### Error Response
478
479
#### Bad Request (400)
480
| JSON Path | Type | Example | Required |
481
|---|---|---|---|
482
| message | string | `"error message"` | yes |
483
| xid | string | `"xRequestId"` | yes |
484
485
---
486
487
## 14. Confirm Mobile (Verify OTP)
488
489
| Type | Value |
490
|---|---|
491
| API Path | `/api/v1/foreign/user/verify/mobile/check` |
492
| Request Type | `POST` |
493
| Content-Type | `application/json` |
494
495
### Request Body
496
497
| Key | Type | Example | Required |
498
|---|---|---|---|
499
| registerId | string | `"registerId"` | yes |
500
| referenceCode | string | `"AB1234"` | no |
501
| otp | string | `"123456"` | no |
502
| mobile | string | `"0987654321"` | no |
503
| isUpdate | boolean | `false` | no |
504
| pageId | number | `1600` | no |
505
506
### Success Response (200)
507
508
| JSON Path | Type | Example | Required |
509
|---|---|---|---|
510
| xid | string | `"xRequestId"` | yes |
511
512
### Error Response
513
514
#### Bad Request (400)
515
| JSON Path | Type | Example | Required |
516
|---|---|---|---|
517
| message | string | `"error message"` | yes |
518
| xid | string | `"xRequestId"` | yes |