Project

General

Profile

Onboarding Foreign API Spc » History » Version 4

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