The Caplia API uses Personal Access Tokens (PATs) sent as Bearer tokens in theDocumentation Index
Fetch the complete documentation index at: https://docs.venture.caplia.ai/llms.txt
Use this file to discover all available pages before exploring further.
Authorization header. Every request to an authenticated endpoint must include:
Key format
Live vs test
Two environment prefixes are minted depending on which Caplia portal you create the key from:| Prefix | Mint from | Accepted by | What it sees |
|---|---|---|---|
cap_inv_live_ | The production Caplia portal | api.venture.caplia.ai and mcp.venture.caplia.ai | Your real pipeline data |
cap_inv_test_ | The staging Caplia portal | api-sandbox.venture.caplia.ai and mcp-sandbox.venture.caplia.ai | Sandbox / test data, isolated from production |
test keys when developing or testing an integration so that you can’t accidentally create or read against real deals. The production endpoints reject test keys with 401 and vice-versa, so leaking a key into the wrong environment fails closed.
The prefix makes leaked keys instantly identifiable and greppable in logs. If you see cap_inv_live_* anywhere it shouldn’t be, treat it as a leak and revoke immediately.
Creating a key
- Sign in to Caplia
- Settings → API Keys → Create new key
- Give it a descriptive name (you’ll see this in the list later - “CRM integration”, “Zapier prod”, etc.)
- Pick scope:
readorwrite(see below) - Click Create
Scopes
v1 has two scopes. A key carries one or both.Read access to all
GET endpoints - companies, scores, metrics, documents, theses, views, jobs.Read access (everything
read allows) plus POST endpoints - create companies, upload decks, attach documents, add notes.read for dashboard-style integrations that only consume Caplia data. Pick write when you also need to push deals or documents in.
Finer-grained scopes (companies:write, decks:write) will come in a future version when there’s real demand for delegated permissions.
Using the token
Every authenticated request needs the header:Error responses
If the header is missing or malformed:401 Unauthorized
403 Forbidden
request_id value is useful when emailing support - it lets us trace your exact request in our logs.
Short-lived upload tokens (cap_upload_*)
The Venture Form Widget — used to embed pitch-deck upload into public application forms — does not use Personal Access Tokens. Long-lived cap_inv_* keys must never ship to a browser. Instead, public form uploads use a two-step token flow that mirrors S3 presigned POSTs:
- The widget calls
POST /v1/uploads/signwith an opaque, server-allowlistedform_id. No auth header required. - Caplia returns a
cap_upload_<jwt>token — HMAC-signed, 5-minute TTL, single-use, bound to one upload with a max size and MIME type. - The widget POSTs the PDF to
POST /v1/uploads/deckswithAuthorization: Bearer cap_upload_<jwt>.
cap_upload_* tokens by hand — Caplia issues them on behalf of allowlisted forms. They’re not interchangeable with cap_inv_* keys and they can’t read any data; they exist purely to authorise a single deck submission.
See Venture Form Widget for the full integration guide.
Revoking a key
In Settings → API Keys, click the Revoke button on the row. Revocation is immediate - the next request with that key returns401 within seconds.
If you suspect a key has leaked:
- Revoke first - don’t wait
- Then investigate where it leaked (commit history, logs, screenshots)
- Mint a new key, rotate any integrations that use the old one
Security best practices
- Never commit keys to source control. Use environment variables or a secret manager.
- Use one key per integration. If your CRM and your internal dashboard both call the API, give them separate keys. If one leaks you can revoke without breaking the other.
- Use the least-privilege scope. Use
readif the integration only reads. Reservewritefor systems that actually push data in. - Rotate periodically. Caplia doesn’t enforce expiration today, but rotating every 90 days is good hygiene.
- Watch the
last_used_attimestamp in Settings → API Keys. A key that should be active but isn’t has either been replaced or your integration is broken.
What lives in logs
We log:- The first 12 characters of the key (
cap_inv_live) plus the last 4 characters - The endpoint, status code, and request_id
- The user the key belongs to
- The full plaintext key
- The
Authorizationheader - Request bodies (including uploaded files)