VDR Module

Virtual data rooms for deal diligence and LP onboarding — create rooms, upload documents, answer Q&A, and run semantic search over your document set.

Data Models

ModelDescriptionKey Fields
DealRoomA secure data room with folder structure, members, and document setid, name, room_type, status, organization_id, root_folder_id
DocumentA file stored in a room folderid, original_filename, folder_id, file_type, uploaded_by, created_at
FolderHierarchical folder in a roomid, name, parent_id, room_id
QuestionLP-visible Q&A question in a roomid, folder_id, body, status, ref, is_public
DealRoomMemberUser access record for a roomid, room_id, user_id, email, role

Room Types

TypeUse case
company_investmentStandard diligence room for a deal
fund_investmentFund-level data room (investor-facing)
gp_fund_raiseLP fundraising room with ODD access enabled

Cross-Module Links

DirectionHow to navigate
DealRoom → CRM (Deal)Find Transaction where linked_room_id = room.id → Transaction.deal_id → Deal
DealRoom → LP CRMLPInvestor.lp_room_id = room.id → GET /api/v1/fundos/lp-crm/investors?lp_room_id={id}
Note: To link a Deal to a VDR room, create a Transaction with deal_id set, then set Transaction.linked_room_id. This is the canonical cross-module join — Deal has no direct room_id.

Quickstart (3 steps)

Step 1 — Authenticate

export FUNDOS_API_KEY=vdr_your_key_here

Step 2 — Create a diligence room

curl -X POST https://kela.com/api/v1/rooms \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme DD Room", "room_type": "company_investment"}'

# → {"success": true, "data": {"id": 12, "name": "Acme DD Room", "room_type": "company_investment"}}

Step 3 — Upload a document and search it

# Upload
curl -X POST https://kela.com/api/v1/rooms/12/documents \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -F "file=@pitch_deck.pdf"

# → {"success": true, "data": {"id": 88, "original_filename": "pitch_deck.pdf"}}

# Semantic search
curl -X POST https://kela.com/api/v1/rooms/12/search \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "management team backgrounds"}'

Webhook Events

EventTriggerPayload
room.created New DealRoom created {"room_id", "name", "room_type"}
document.uploaded Document uploaded to a room {"room_id", "document_id", "filename", "uploader_id"}
qa.answered Q&A question receives an answer {"room_id", "question_id", "question_text"}

Endpoints

MethodPathDescriptionRequired Params
GET/api/v1/roomsList accessible rooms
GET/api/v1/rooms/{id}Get room detail + statsroom_id
POST/api/v1/roomsCreate roomname, room_type
GET/api/v1/rooms/{id}/documentsList documentsroom_id
POST/api/v1/rooms/{id}/documentsUpload document (multipart)file
GET/api/v1/rooms/{id}/documents/{doc_id}/download-urlGet signed download URLroom_id, doc_id
POST/api/v1/rooms/{id}/searchSemantic search with citationsquery
GET/api/v1/rooms/{id}/qaList Q&A questionsroom_id
POST/api/v1/rooms/{id}/qa/{qid}/answerPost an answer (admin only)body
GET/api/v1/rooms/{id}/membersList membersroom_id
GET/api/v1/rooms/{id}/audit-logGet audit logroom_id

Error Codes

CodeHTTPHint
room_not_found404Verify room_id against GET /api/v1/rooms
document_not_found404Verify document_id against GET /api/v1/rooms/{id}/documents
room_name_taken409A room with this name already exists in your org
invalid_room_type400room_type must be company_investment, fund_investment, or gp_fund_raise
question_not_found404Verify qa_id against GET /api/v1/rooms/{id}/qa

→ Build your first FundOS app in 15 minutes  |  Module contract JSON  |  Changelog