Marketplace » History » Revision 30
Revision 29 (Ryan Supawarapong, 02/23/2026 02:03 AM) → Revision 30/36 (Ryan Supawarapong, 02/23/2026 02:07 AM)
# Marketplace
There are the following API:
1. [Lists](#Lists)
2. [Posted](#Posted)
3. [Interested](#Interested)
4. [Get Interested](#Get-Interested)
## Diagram
<img src="market_place.png"><br>
```
title Market Place
actor "customer" as c
actor "owner" as o
actor "admin" as a
participant "frontend" as fe
participant "admin" as adm
participant "backend" as be
database "database" as db
participant "notification" as n
o->fe: post sell asset
fe->be: verify asset and quantities
be<->db: query database
be->fe: true/false
fe->c: true: dispaly new post
c->fe: click "interest" button
fe->be: update status and count down 15 minutes
be<->db: update database
be->fe: true/false
fe->c: show status "locked"
be->n: update payment notification
n->c: email bank account info and payment noti within 15 minutes
c->n: click confirm payment
c->fe: totp to confirm payment
fe->be: update payment
fe->fe: update status to "pending payment confirm"
be<->db: update database
be->n: update payment confirmation
n->o: email payment acknowledge confirmation and pay service fees
o->n: click confirm service fees
o->fe: totp to confirm service fees
fe->be: update service fees transaction
fe->fe: update status to "pending service fees confirm"
be<->db: update database
be->n: send service fees notification
n->a: get noti for new service fees
adm<->be: get new service fees
a->adm: verify service fees
adm<->be: show service fees
a->adm: approved service fees
adm->be: update service fees status
be<->db: update database
be->n: send notification
n->o: get noti service fees approved
fe->fe: update status to "complete"
```
## API route
## Lists
| Type | Value |
|---|---|
| API Path | `/api/v1/customer/marketplace/lists` |
| Request Type | `GET` |
| Content-Type | `application/json` |
| Authorization | `bearer ...` |
### Request Body
| Key | Type | Example | Required |
|---|---|---|---|
| - | - | - | no body |
### Success Response (200)
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"success"` | yes |
| data | object | `{"transactions":[...]}` | yes |
| data.transactions | array<object> | `[{"id":1,"transactionId":"TXN_123",...}]` | yes |
| data.transactions[].id | number | `1` | no (`omitempty`) |
| data.transactions[].sellerCode | string | `"90000005"` | no |
| data.transactions[].sellerName | string | `"First Last"` | no |
| data.transactions[].assetCode | string | `"ASSET001"` | no |
| data.transactions[].assetName | string | `"Asset 001"` | no |
| data.transactions[].assetShortName | string | `"A001"` | no |
| data.transactions[].quantity | number | `10` | no |
| data.transactions[].price | number | `10.01` | no |
| data.transactions[].totalAmount | number | `100.10` | no |
| data.transactions[].currency | string | `"THB"` | no |
| data.transactions[].status | number | `1` | no |
### Error Response
#### Internal Server Error (500)
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"error"` | yes |
| message | string | `"database error"` | yes |
---
## Posted
| Type | Value |
|---|---|
| API Path | `/api/v1/customer/marketplace/posted` |
| Request Type | `POST` |
| Content-Type | `application/json` |
| Authorization | `bearer ...` |
### Request Body
> `customerCode` and `customerName` are injected from auth token by handler, not required from client body.
| Key | Type | Example | Required |
|---|---|---|---|
| assetCode | string | `"ASSET001"` | yes |
| assetName | string | `"Asset 001"` | yes |
| assetShortName | string | `"A001"` | yes |
| quantity | number | `5` | yes (`> 0`) |
| price | number | `10` | yes (`> 0`) |
| totalAmount | number | `50` | yes (`> 0`) |
### Success Response (200)
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"success"` | yes |
### Error Response
#### Bad Request (400) - bind error
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"failed"` | yes |
| data | object | `{"error":"...bind error..."}` | yes |
| data.error | string | `"code=400, message=..."` | yes |
#### Unauthorized (401) - token missing/invalid
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"failed"` | yes |
| data | object | `{"error":"invalid token claims"}` | yes |
| data.error | string | `"invalid token claims"` | yes |
#### Bad Request (400) - validation error
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"failed"` | yes |
| data | object | `{"errors":{"assetCode":"required"}}` | yes |
| data.errors | object | `{"field":"message"}` | yes |
#### Internal Server Error (500)
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"error"` | yes |
| message | string | `"internal error"` | yes |
---
## Interested
| Type | Value |
|---|---|
| API Path | `/api/v1/customer/marketplace/interested` |
| Request Type | `POST` |
| Content-Type | `application/json` |
| Authorization | `bearer ...` |
### Request Body
| Key | Type | Example | Required |
|---|---|---|---|
| assetCode | string | `"ASSET001"` | yes |
| assetName | string | `"Asset 001"` | yes |
| assetShortName | string | `"A001"` | yes |
| quantity | number | `5` | yes (`> 0`) |
| price | number | `10` | yes (`> 0`) |
| totalAmount | number | `50` | yes (`> 0`) |
| transactionId | string | `"TXN_123"` | yes |
### Success Response (200)
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"success"` | yes |
| data | object | `{"emailID":"emailID"}` | yes |
| data.emailID | string | `"emailID"` | yes |
### Error Response
#### Bad Request (400) - bind error
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"failed"` | yes |
| data | object | `{"error":"...bind error..."}` | yes |
| data.error | string | `"code=400, message=..."` | yes |
#### Unauthorized (401) - token missing/invalid
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"failed"` | yes |
| data | object | `{"error":"invalid token claims"}` | yes |
| data.error | string | `"invalid token claims"` | yes |
#### Bad Request (400) - validation error
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"failed"` | yes |
| data | object | `{"errors":{"transactionId":"required"}}` | yes |
| data.errors | object | `{"field":"message"}` | yes |
#### Internal Server Error (500)
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"error"` | yes |
| message | string | `"internal error"` | yes |
---
## Get Interested
| Type | Value |
|---|---|
| API Path | `/api/v1/customer/marketplace/interested/lists` |
| Request Type | `GET` |
| Content-Type | `application/json` |
| Authorization | `bearer ...` |
### Request Body
No request body.
### Success Response (200)
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"success"` | yes |
| data | object | `{"interestedList":[...]}` | yes |
| data.interestedList | array<object> | `[{"transactionId":"TXN_123",...}]` | yes |
#### `data.interestedList[]` object
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status id | string number | `"success"` `1` | yes no |
| data transactionId | object string | `{"transactions":[...]}` `"TXN_123"` | yes no |
| data.transactions buyerCode | array<object> string | `[{"id":1,"transactionId":"TXN_123",...}]` `"90000004"` | yes no |
| data.transactions[].id buyerName | number string | `1` `"FirstLast"` | no (`omitempty`) |
| data.transactions[].sellerCode sellerCode | string | `"90000005"` | no |
| data.transactions[].sellerName sellerName | string | `"First Last"` | no |
| data.transactions[].buyerCode assetCode | string | `"90000004"` `"ASSET001"` | no |
| data.transactions[].buyerName assetName | string | `"First Last2"` `"Asset 001"` | no |
| data.transactions[].assetCode assetShortName | string | `"ASSET001"` `"A001"` | no |
| data.transactions[].assetName quantity | string number | `"Asset 001"` `10` | no |
| data.transactions[].assetShortName price | string number | `"A001"` `10.01` | no |
| data.transactions[].quantity totalAmount | number | `10` `100.10` | no |
| data.transactions[].price currency | number string | `10.01` `"THB"` | no |
| data.transactions[].totalAmount status | number | `100.10` `1` | no |
| data.transactions[].currency paymentId | string | `"THB"` `"PMT_123"` | no |
| data.transactions[].status createdAt | number string (datetime) | `1` `"2026-02-23T10:00:00Z"` | no |
| deletedAt | object/null | `null` | no |
### Error Response
#### Unauthorized (401) - token missing/invalid
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"failed"` | yes |
| data | object | `{"error":"invalid token claims"}` | yes |
| data.error | string | `"invalid token claims"` | yes |
#### Internal Server Error (500)
| JSON Path | Type | Example | Required |
|---|---|---|---|
| status | string | `"error"` | yes |
| message | string | `"internal error"` | yes |