Appearance
Product ownership
Request ownership of a scanned product, approve or reject a request, and transfer ownership using its verification flow.
Access labels such as Origin + Brand key + Customer are defined in Headers and access. Each endpoint ends in a Try it console; set the host and keys once in its Settings tab or on the overview.
Request product ownership
| Method | URL path | Required access |
|---|---|---|
POST | /api/v1/brand/request/product/ownership | Origin + Brand key + Customer |
Request fields:
| Field | Type | Required | Rules / meaning |
|---|---|---|---|
body.payload | object | yes | — |
body.payload.brl_id | number | yes | — |
Example:
bash
curl -X POST "$BASE_URL/api/v1/brand/request/product/ownership" \
-H "Origin: $ORIGIN" \
-H "api-key: $API_KEY" \
-H "Authorization: Bearer $CUSTOMER_TOKEN" \
-H 'Content-Type: application/json' \
--data-raw '{"payload":{"brl_id":1}}'Response: JSON with success: true and result containing the operation’s service data.
Source: app/v1/controller/productownership_controller.ts:13 → requestProductOwnership; routes: routes/v1/productownership_route.ts:50; service: _requestProductOwnership (app/v1/service/productownership_service.ts:28).
Get product ownership by ID
| Method | URL path | Required access |
|---|---|---|
GET | /api/v1/brand/product/ownership/:id | Origin + Brand key + Customer |
Request fields:
| Field | Type | Required | Rules / meaning |
|---|---|---|---|
path.id | number | yes | — |
Example:
bash
curl -X GET "$BASE_URL/api/v1/brand/product/ownership/1" \
-H "Origin: $ORIGIN" \
-H "api-key: $API_KEY" \
-H "Authorization: Bearer $CUSTOMER_TOKEN"Response: JSON with success: true and result containing the operation’s service data.
Source: app/v1/controller/productownership_controller.ts:45 → getProductOwnershipById; routes: routes/v1/productownership_route.ts:60; service: _getProductOwnershipById (app/v1/service/productownership_service.ts:169).
Approve or reject product ownership
| Method | URL path | Required access |
|---|---|---|
POST | /api/v1/brand/approve-reject/product/ownership | Origin + Brand key + Customer |
Request fields:
| Field | Type | Required | Rules / meaning |
|---|---|---|---|
body.payload | object | yes | Exactly one of ("approve" , "reject") |
body.payload.id | number | yes | — |
body.payload.approve | boolean | optional | — |
body.payload.reject | boolean | optional | — |
Example:
bash
curl -X POST "$BASE_URL/api/v1/brand/approve-reject/product/ownership" \
-H "Origin: $ORIGIN" \
-H "api-key: $API_KEY" \
-H "Authorization: Bearer $CUSTOMER_TOKEN" \
-H 'Content-Type: application/json' \
--data-raw '{"payload":{"id":1,"approve":true}}'Response: JSON with success: true and result containing the operation’s service data.
Source: app/v1/controller/productownership_controller.ts:70 → approveOrRejectProductOwnership; routes: routes/v1/productownership_route.ts:70; service: _approveOrRejectProductOwnership (app/v1/service/productownership_service.ts:260).
Transfer product ownership
| Method | URL path | Required access |
|---|---|---|
POST | /api/v1/brand/transfer/product/ownership | Origin + Brand key + Customer |
Request fields:
| Field | Type | Required | Rules / meaning |
|---|---|---|---|
body.payload | object | yes | — |
body.payload.id | number | yes | — |
body.payload.otp | string | yes | Whitespace trimmed |
Example:
bash
curl -X POST "$BASE_URL/api/v1/brand/transfer/product/ownership" \
-H "Origin: $ORIGIN" \
-H "api-key: $API_KEY" \
-H "Authorization: Bearer $CUSTOMER_TOKEN" \
-H 'Content-Type: application/json' \
--data-raw '{"payload":{"id":1,"otp":"123456"}}'Response: JSON with success: true and result containing the operation’s service data.
Source: app/v1/controller/productownership_controller.ts:108 → transferProductOwnership; routes: routes/v1/productownership_route.ts:80; service: _transferProductOwnership (app/v1/service/productownership_service.ts:416).
Lifecycle
Ownership is a chain of rows per scanned code (brl_id), each one owner_level above the last, with a status of firstowner, raised, accepted or rejected. The current owner is the highest-level row that is firstowner or accepted.
- Request creates a
raisedrow one level above the current owner and emails the owner a link to/collectible/ownership?token=…&id=…on the storefront. - Approve stores a hashed one-time code on the row and sends the code to the owner; the row stays
raised. It is refused if another request at the same level has already been accepted. - Transfer checks the code, marks the row
accepted, and moves the collectible to the requester.
Only the current owner (fromUserId) can approve, reject or transfer. The journey is the ownership-transfer web flow.