Issue Stock
With an issuer, stock class, and stakeholder created, you can now issue stock to stakeholders. This is the first actual transaction on your cap table.
In the primary /app flow, the connected ADMIN wallet calls issueStock directly. After confirmation, the app validates optimistic metadata through POST /transactions/issuance/stock/register-onchain; the poller writes the canonical issuance and chain-generated IDs. The server-signed alternative below calls issuanceController.js.
Send a POST request
Using Postman or curl, send a POST request to http://localhost:8293/transactions/issuance/stock
{
"issuerId": "<YOUR_ISSUER_ID>",
"data": {
"stakeholder_id": "<YOUR_STAKEHOLDER_ID>",
"stock_class_id": "<YOUR_STOCK_CLASS_ID>",
"quantity": "100000",
"share_price": {
"amount": "4.20",
"currency": "USD"
},
"stock_legend_ids": [],
"custom_id": "CS-A-001",
"security_law_exemptions": [],
"comments": ["Founder stock issuance"]
}
}Replace the IDs with the _id values from your previous creation responses.
Check the response
The server-signed response includes a prepared OCF issuance shape. Its validation IDs are not the authoritative onchain IDs; read the poller-backed history after confirmation for the canonical transaction and security IDs.
API examples use human share_price.amount values. The contract stores them scaled by 1e10 (10,000,000,000). Divide raw onchain values by 1e10 before comparing. The server and poller handle this automatically for API consumers.
{
"stockIssuance": {
"id": "<GENERATED_ISSUANCE_ID>",
"security_id": "<GENERATED_SECURITY_ID>",
"date": "2026-01-01",
"object_type": "TX_STOCK_ISSUANCE",
"stakeholder_id": "<YOUR_STAKEHOLDER_ID>",
"stock_class_id": "<YOUR_STOCK_CLASS_ID>",
"quantity": "100000",
"share_price": {
"amount": "4.20",
"currency": "USD"
},
"stock_legend_ids": [],
"custom_id": "CS-A-001",
"security_law_exemptions": [],
"comments": [
"Founder stock issuance"
]
}
}Outputs
| Field | What it identifies |
|---|---|
id | The issuance transaction’s OCF ID. |
security_id | Identifies an active block of shares. Use the canonical value from poller-backed history for later security-specific actions. Transfers and partial lifecycle actions may consume a security and create new balance security IDs. |
date | Onchain timestamp at the issuance block. |
Required fields
| Field | Description |
|---|---|
stakeholder_id | The stakeholder receiving the shares. |
stock_class_id | The class of stock being issued. |
quantity | Number of shares to issue, as a string integer. |
share_price | Object with human amount and currency. The contract stores amount * 1e10 (10,000,000,000). The server scales on write; the poller unscales on read. |
stock_legend_ids | Legend IDs from POST /stock-legend/create. Pass [] if you don’t need any. |
custom_id | Issuance label (e.g. CS-A-001). Free-form, but unique custom IDs make support workflows easier. |
security_law_exemptions | Reg D / Reg S exemptions cited by the issuance. Pass [] if none apply. |
Viewing historical transactions
Once stock is issued, you can view all transactions for an issuer:
GET /historical-transactions/issuer-id/<YOUR_ISSUER_ID>This returns all stock issuances, transfers, cancellations, and other equity events.