Products
A product represents a crypto security issued by an issuer.
Creating a product
To create a product ensure, that you have already created an issuer and have the ID of the issuer resource available.
The following data is needed to create a product:
issuer_id
ID of the issuer the product should be created for
name
Name of the product. This will be displayed across Cashlink Connect and in the token smart contract
product_type
The legal type of the product. These types are available: DIGITAL_COMPANY_SHARE
BOND
SUBORDINATED_LOAN
PARTICIPATION_PAPER
PARTICIPATION_RIGHT,
AIF
DEBT_SECURITY
CONVERTIBLE_BOND
FUND_SHARE
ewpg
If set to true, a crypto security will be created. If set to false, a digital security will be created
isin
ISIN of the crypto security to be created
nominal_value
The nominal value per unit as stated in the issuance document. If the value of provide_nominal_value
is set to True, this field needs to be set.
provide_nominal_value
Set this to True if you want to provide a nominal_value
. If this is set to False, you need to set a value for issuance_price
.
issuance_price
If the value of provide_nominal_value
is set to False, this field needs to be set to the initial price of one unit at issuance.
max_issuable_amount
The maximum number of units for sale as stated in the issuance document
step_size
Investments on the primary market are only possible in an integer multiple of the step size value. E.g. if step_size
is 5, investments can only be made for 5, 10, 15, ...
agio_percent
Percentage value of agio that should be used for investments on the primary market
payment_deadline
Number of days that investors have time to pay the investment amount on the primary market
cancellation_deadline
Number of days that investors have time to cancel the investment on the primary market
network
DLT network where the crypto security should be issued on.
These networks are available on production: ETH-MAINNET
POLYGON-MAINNET
STELLAR-PUBNET
These networks are available on demo: ETH-TEST POLYGON-AMOY STELLAR-TESTNET
code
Should be set to a unique human-readable string to identify the crypto security on the DLT network and is third-party wallet software. Must be alphanumeric and shorter than 12 characters.
calculation_factor
The relation between one token and one asset. If there is no underlying real world asset, set this value to 1.
lock_in_time
Until this date and time, the crypto security cannot be transferred between investors. Only investments on the primary market are possible.
issuance_document_id
ID of the issuance document that will be made available to the public on the Cashlink website
publication_restricted
Indicates if the publication of the product is restricted. Please note that a publication can only be restricted if the crypto security is offered only to a restricted audience.
Example:
r = requests.post(
f'{URL}/issuer/v2/documents/',
files={'file': ('issuance-terms.pdf', b'ASD', 'application/pdf')},
headers={**headers, 'X-Idempotency-Key': make_key()}
)
assert r.status_code < 300, r.content
issuance_document_id = r.json()['id']
r = requests.post(
f'{URL}/issuer/v2/products/',
json={
'name': 'Test',
'product_type': 'BOND',
'agio_percent': '0',
'provide_nominal_value': True,
'nominal_value': {
'amount': '1000',
'decimals': 3,
'currency': 'EUR'
},
'max_issuable_amount': 1000000,
'step_size': 1,
'payment_deadline': 3,
'cancellation_deadline': 14,
'network': 'polygon-amoy',
'code': 'TEST25',
'calculation_factor': 1,
'lock_in_time': '2026-09-22T11:58:26.318Z',
'issuance_document_id': issuance_document_id,
'issuer_id': issuer_id,
'ewpg': True,
'isin': 'US0378331005',
'publication_restricted': False
},
headers={**headers, 'X-Idempotency-Key': make_key()}
)
assert r.status_code < 300, r.content
print(f'Product: {r.json()['id']}')
After the product is created, Cashlink will validate the product details and check if they match the uploaded issuance documents. Once the check is done, the product is deployed and can be used for issuances.
Retrieving product information
You can use the products endpoint to retrieve a list of all products and details about individual products.
Example:
r = requests.get(
f'{URL}/issuer/v2/products/',
headers={**headers}
)
assert r.status_code < 300, r.content
product_id = r.json()['results'][0]['id']
r = requests.get(
f'{URL}/issuer/v2/products/{product_id}/',
headers={**headers}
)
assert r.status_code < 300, r.content
print(f'Status: {r.json()['status']}')
The product status field may have the following values
created
You have submitted the product data but the validation failed. If a product is in this state you may still edit (patch) the product details.
validation_pending
The product is currently validated by Cashlink.
validation_success
The product has been validated successfully. The issuance document is published on the Cashlink website.
queued
The deployment on the DLT network is queued and will be processed shortly.
processing
The deployment process of the smart contract has been started but is not yet finished.
succeeded
The deployment process of the smart contract is done and you can retrieve the smart contract address.
failed
The deployment process on the DLT network has failed. Reach out to the Cashlink Service Desk to clarify the details.
unknown
The deployment process is in an unknown state. Reach out to the Cashlink Service Desk to clarify the details.
Last updated
Was this helpful?