REST API Reference
Base URL: https://api.opencapstack.com/api/v1
OpenAPI Spec: /openapi.json
Interactive Docs: /api-docs (Swagger UI)
All requests require:
Authorization: Bearer <token>
Content-Type: application/json
Authentication
| Method | Endpoint | Description |
|---|---|---|
POST | /auth/register | Create account, returns JWT |
POST | /auth/login | Email/password login |
POST | /auth/ainative-login | AINative SSO login (server-side) |
POST | /auth/refresh | Refresh JWT using refresh token |
POST | /agents/onboard | Zero-friction agent registration |
GET | /auth/me | Get current user profile |
Stakeholders
Cap table participants — founders, investors, employees, advisors.
| Method | Endpoint | Description |
|---|---|---|
GET | /stakeholders | List all stakeholders |
POST | /stakeholders | Create a stakeholder |
GET | /stakeholders/:id | Get stakeholder by ID |
PUT | /stakeholders/:id | Update stakeholder |
DELETE | /stakeholders/:id | Delete stakeholder |
Create a Stakeholder
curl -X POST https://api.opencapstack.com/api/v1/stakeholders \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Jane Doe",
"email": "jane@startup.com",
"type": "EMPLOYEE",
"title": "CTO"
}'
Stakeholder types: FOUNDER INVESTOR EMPLOYEE ADVISOR BOARD_MEMBER
Response:
{
"id": "stakeholder_abc123",
"name": "Jane Doe",
"email": "jane@startup.com",
"type": "EMPLOYEE",
"title": "CTO",
"companyId": "co_xyz789",
"createdAt": "2026-05-13T00:00:00Z"
}
Share Classes
| Method | Endpoint | Description |
|---|---|---|
GET | /share-classes | List all share classes |
POST | /share-classes | Create a share class |
GET | /share-classes/:id | Get share class by ID |
PUT | /share-classes/:id | Update share class |
Create a Share Class
curl -X POST https://api.opencapstack.com/api/v1/share-classes \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Series A Preferred",
"type": "PREFERRED",
"totalShares": 10000000,
"pricePerShare": 1.00,
"liquidationPreference": 1.0,
"conversionRatio": 1.0
}'
Share class types: COMMON PREFERRED OPTIONS_POOL WARRANT
Equity Grants
Stock options, RSUs, and warrants issued to stakeholders.
| Method | Endpoint | Description |
|---|---|---|
GET | /equity-grants | List all grants |
POST | /equity-grants | Issue a new grant |
GET | /equity-grants/:id | Get grant by ID |
PUT | /equity-grants/:id | Update grant |
GET | /equity-grants/:id/vesting | Get vesting schedule |
Issue an Equity Grant
curl -X POST https://api.opencapstack.com/api/v1/equity-grants \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"stakeholderId": "stakeholder_abc123",
"shareClassId": "sc_options_pool",
"quantity": 100000,
"grantType": "OPTION",
"strikePrice": 0.10,
"vestingSchedule": "4_YEAR_1_YEAR_CLIFF",
"grantDate": "2026-05-13"
}'
Grant types: OPTION RSU WARRANT RESTRICTED_STOCK
Vesting schedules: 4_YEAR_1_YEAR_CLIFF 3_YEAR_MONTHLY IMMEDIATE CUSTOM
Response:
{
"id": "grant_def456",
"grantNumber": "GRANT-MP34648T-FF2DB6F9",
"stakeholderId": "stakeholder_abc123",
"quantity": 100000,
"grantType": "OPTION",
"strikePrice": 0.10,
"status": "PENDING",
"vestingStartDate": "2026-05-13",
"fullyVestedDate": "2030-05-13"
}
SAFE Notes
Simple Agreements for Future Equity.
| Method | Endpoint | Description |
|---|---|---|
GET | /safes | List all SAFEs |
POST | /safes | Create a SAFE |
GET | /safes/:id | Get SAFE by ID |
PUT | /safes/:id | Update SAFE |
Create a SAFE
curl -X POST https://api.opencapstack.com/api/v1/safes \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"investorId": "stakeholder_investor1",
"investmentAmount": 500000,
"valuationCap": 10000000,
"discountRate": 0.20,
"safeType": "POST_MONEY",
"issueDate": "2026-05-13"
}'
SAFE types: PRE_MONEY POST_MONEY MFN
409A Valuations
| Method | Endpoint | Description |
|---|---|---|
GET | /valuations | List valuations |
POST | /valuations | Request a new 409A valuation |
GET | /valuations/latest | Get most recent valuation |
GET | /valuations/:id | Get valuation by ID |
Request a Valuation
curl -X POST https://api.opencapstack.com/api/v1/valuations \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"valuationDate": "2026-05-13",
"methodology": "INCOME_APPROACH",
"notes": "Pre-Series A valuation"
}'
Cap Table
| Method | Endpoint | Description |
|---|---|---|
GET | /cap-table | Full cap table summary |
GET | /cap-table/fully-diluted | Fully diluted share count |
POST | /cap-table/dilution | Model dilution for a new round |
POST | /cap-table/waterfall | Run liquidation waterfall analysis |
Cap Table Summary
curl https://api.opencapstack.com/api/v1/cap-table \
-H "Authorization: Bearer $TOKEN"
Response:
{
"companyId": "co_xyz789",
"asOfDate": "2026-05-13",
"totalAuthorizedShares": 20000000,
"totalIssuedShares": 12500000,
"fullyDilutedShares": 14000000,
"shareClasses": [
{
"name": "Common Stock",
"shares": 8000000,
"ownership": 0.571
},
{
"name": "Series A Preferred",
"shares": 4500000,
"ownership": 0.321
}
],
"topStakeholders": [
{ "name": "Jane Doe (Founder)", "shares": 5000000, "ownership": 0.357 },
{ "name": "Acme Ventures", "shares": 4500000, "ownership": 0.321 }
]
}
Dilution Modeling
curl -X POST https://api.opencapstack.com/api/v1/cap-table/dilution \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"roundSize": 5000000,
"preMoneyValuation": 20000000,
"newShareClassName": "Series B Preferred"
}'
Documents
| Method | Endpoint | Description |
|---|---|---|
GET | /documents | List documents |
POST | /documents | Upload a document |
GET | /documents/:id | Get document metadata |
GET | /documents/:id/download | Download document |
DELETE | /documents/:id | Delete document |
Upload a Document
curl -X POST https://api.opencapstack.com/api/v1/documents \
-H "Authorization: Bearer $TOKEN" \
-F "file=@grant_agreement.pdf" \
-F "type=GRANT_AGREEMENT" \
-F "stakeholderId=stakeholder_abc123" \
-F "grantId=grant_def456"
Financial Reports
| Method | Endpoint | Description |
|---|---|---|
GET | /financial-reports | List reports |
POST | /financial-reports | Generate a report |
GET | /financial-reports/:id | Get report |
Generate an Investor Report
curl -X POST https://api.opencapstack.com/api/v1/financial-reports \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "INVESTOR_UPDATE",
"format": "json",
"asOfDate": "2026-05-13"
}'
Report types: INVESTOR_UPDATE CAP_TABLE_SUMMARY EQUITY_LEDGER TAX_SUMMARY AUDIT_READY
Pagination
All list endpoints support cursor-based pagination:
GET /api/v1/stakeholders?page=1&limit=50
Response envelope:
{
"data": [...],
"pagination": {
"page": 1,
"limit": 50,
"total": 142,
"hasMore": true
}
}
Error Codes
| Status | Code | Meaning |
|---|---|---|
400 | VALIDATION_ERROR | Invalid request body |
401 | UNAUTHORIZED | Missing or expired token |
403 | FORBIDDEN | Valid token but insufficient scope |
404 | NOT_FOUND | Resource does not exist |
409 | CONFLICT | Duplicate resource (e.g. same email) |
429 | RATE_LIMITED | Too many requests — see rate limits |
500 | INTERNAL_ERROR | Server error |
Error response shape:
{
"error": "VALIDATION_ERROR",
"message": "stakeholderId is required",
"field": "stakeholderId",
"statusCode": 400
}
Rate Limits
| Plan | API calls/month | Burst |
|---|---|---|
| Free | 1,000 | 10/min |
| Starter | 10,000 | 60/min |
| Professional | 100,000 | 300/min |
| Enterprise | Unlimited | 1,000/min |
Rate limit headers are included on every response:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1715000000