Skip to content

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 ​

MethodURL pathRequired access
POST/api/v1/brand/request/product/ownershipOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
body.payloadobjectyes—
body.payload.brl_idnumberyes—

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 ​

MethodURL pathRequired access
GET/api/v1/brand/product/ownership/:idOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
path.idnumberyes—

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 ​

MethodURL pathRequired access
POST/api/v1/brand/approve-reject/product/ownershipOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
body.payloadobjectyesExactly one of ("approve" , "reject")
body.payload.idnumberyes—
body.payload.approvebooleanoptional—
body.payload.rejectbooleanoptional—

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 ​

MethodURL pathRequired access
POST/api/v1/brand/transfer/product/ownershipOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
body.payloadobjectyes—
body.payload.idnumberyes—
body.payload.otpstringyesWhitespace 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 raised row 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.

Batch platform, Shopify app and API documentation