Securities
Create a security
https://capable.so/api/v1/securitiesRequires an API key with the securities:write scope · How keys work
Body
Send JSON with Content-Type: application/json.
typestringrequiredKind of security.
One of
shareoptionrsarsusafenotewarrantstakeholderIdstringrequiredThe holder. Create them first with POST /stakeholders.
quantitynumberrequiredShares or units, greater than 0. For a SAFE or note, the principal in US dollars.
issueDatedaterequiredIssue or grant date, YYYY-MM-DD.
statusstringdefault: draftdraft lands in Drafts for an admin to review and publish. outstanding records it on the cap table straight away.
One of
draftoutstandingshareClassIdstringShare class. For plan awards it defaults to the plan's class.
equityPlanIdstringEquity plan for an option, RSA or RSU.
vestingScheduleIdstringVesting schedule, from the schedules set up in the app.
vestingCommencementDatedateVesting start date, YYYY-MM-DD. Defaults to the issue date when a vesting schedule is given.
exercisePricenumberExercise price per share for an option or warrant, in US dollars.
pricePerSharenumberPurchase price per share for shares or an RSA, in US dollars.
optionTypestringTax type of an option.
One of
isonsoiso_nsocertificateIdstringYour own certificate id. Leave it out and the next id for the class or plan prefix is assigned, such as OPT-10.
valuationCapnumberSAFE or note valuation cap, in US dollars.
discountPercentnumberSAFE or note discount, as a percentage such as 20.
safeTypestringKind of SAFE.
One of
post_moneypre_moneymfnuncappednotesstringA note kept on the security.
Response 201
The new security's id, its certificate id and its status.
idstringThe new security's id.
certificateIdstringThe certificate id given or assigned.
statusstringThe status it was created with.
One of
draftoutstanding
Example
curl -X POST https://capable.so/api/v1/securities \
-H "Authorization: Bearer $CAPABLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "option",
"stakeholderId": "stk_b2j6nq0ve8rc",
"quantity": 40000,
"issueDate": "2026-11-17",
"equityPlanId": "pln_2024plan7b",
"vestingScheduleId": "vst_4y1c_month",
"exercisePrice": 0.42,
"optionType": "iso"
}'{
"id": "sec_m3w8yk1t0hxa",
"certificateId": "OPT-10",
"status": "draft"
}Good to know
- An issue transaction is recorded with the security, so it appears in GET /transactions.
- API writes take effect without the approval step the AI connector uses: an admin chose the key's scopes when creating it. Send drafts when a person should review a grant before it reaches the cap table.
- The write is recorded in the company's activity log as created by the API, and a security.created webhook is sent.
Errors
| Status | When |
|---|---|
| 400 Bad request | The body is not JSON. |
| 401 Unauthorized | The key is missing, invalid or revoked, or its creator lost access. |
| 402 Payment required | The company has no active plan in good standing. |
| 403 Forbidden | The key does not have the securities:write scope. |
| 429 Too many requests | The key went over its rate limit. Wait for Retry-After seconds. |
| 422 Unprocessable | A field is missing or invalid, or stakeholderId is not a stakeholder of the company. |
Every error has the same shape. See Errors, limits and conventions.