Skip to main content

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

MethodEndpointDescription
POST/auth/registerCreate account, returns JWT
POST/auth/loginEmail/password login
POST/auth/ainative-loginAINative SSO login (server-side)
POST/auth/refreshRefresh JWT using refresh token
POST/agents/onboardZero-friction agent registration
GET/auth/meGet current user profile

Stakeholders

Cap table participants — founders, investors, employees, advisors.

MethodEndpointDescription
GET/stakeholdersList all stakeholders
POST/stakeholdersCreate a stakeholder
GET/stakeholders/:idGet stakeholder by ID
PUT/stakeholders/:idUpdate stakeholder
DELETE/stakeholders/:idDelete 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

MethodEndpointDescription
GET/share-classesList all share classes
POST/share-classesCreate a share class
GET/share-classes/:idGet share class by ID
PUT/share-classes/:idUpdate 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.

MethodEndpointDescription
GET/equity-grantsList all grants
POST/equity-grantsIssue a new grant
GET/equity-grants/:idGet grant by ID
PUT/equity-grants/:idUpdate grant
GET/equity-grants/:id/vestingGet 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.

MethodEndpointDescription
GET/safesList all SAFEs
POST/safesCreate a SAFE
GET/safes/:idGet SAFE by ID
PUT/safes/:idUpdate 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

MethodEndpointDescription
GET/valuationsList valuations
POST/valuationsRequest a new 409A valuation
GET/valuations/latestGet most recent valuation
GET/valuations/:idGet 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

MethodEndpointDescription
GET/cap-tableFull cap table summary
GET/cap-table/fully-dilutedFully diluted share count
POST/cap-table/dilutionModel dilution for a new round
POST/cap-table/waterfallRun 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

MethodEndpointDescription
GET/documentsList documents
POST/documentsUpload a document
GET/documents/:idGet document metadata
GET/documents/:id/downloadDownload document
DELETE/documents/:idDelete 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

MethodEndpointDescription
GET/financial-reportsList reports
POST/financial-reportsGenerate a report
GET/financial-reports/:idGet 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

StatusCodeMeaning
400VALIDATION_ERRORInvalid request body
401UNAUTHORIZEDMissing or expired token
403FORBIDDENValid token but insufficient scope
404NOT_FOUNDResource does not exist
409CONFLICTDuplicate resource (e.g. same email)
429RATE_LIMITEDToo many requests — see rate limits
500INTERNAL_ERRORServer error

Error response shape:

{
"error": "VALIDATION_ERROR",
"message": "stakeholderId is required",
"field": "stakeholderId",
"statusCode": 400
}

Rate Limits

PlanAPI calls/monthBurst
Free1,00010/min
Starter10,00060/min
Professional100,000300/min
EnterpriseUnlimited1,000/min

Rate limit headers are included on every response:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1715000000