Skip to content
Dark MatterDark Matter
API

Transfers API

API reference for transfer evaluation, settlement, consent, and indication of interest.

Transfer Lifecycle

The transfer workflow follows a strict sequence: evaluate → IOI → consent → settle. Each step produces events in the audit trail.

POST /v1/transfers/evaluate

Evaluate one or more proposed transfers against the Rights Engine. Returns a verdict with pass/fail/conditional status for each of the 18 compliance checks.

Request

{
  "proposed_transfers": [
    {
      "position": "pos-rd-gp-b-saronic",
      "seller": "part-gp-a",
      "buyer": "part-buyer-001",
      "amount_usd": "2000000"
    }
  ],
  "requester": "part-buyer-001"
}

Response

{
  "transfer_id": "txn-001",
  "overall": "CONDITIONALLY_ALLOWED",
  "requires_counsel_review": false,
  "verdicts": [
    {
      "position": "pos-rd-gp-b-saronic",
      "verdict": {
        "allowed": true,
        "conditional": true,
        "requires_counsel_review": false,
        "checks": [
          { "check": "accreditation", "status": "pass", "detail": "Buyer is accredited investor" },
          { "check": "kyc_aml", "status": "pass", "detail": "KYC verified, AML cleared" },
          { "check": "itar_eligibility", "status": "pass", "detail": "Buyer is US person, ITAR eligible" },
          { "check": "consent_required", "status": "conditional", "detail": "GP consent required" }
        ],
        "pending_actions": [
          { "type": "consent", "party": "part-gp-a", "role": "managing_member", "required": true }
        ]
      },
      "carry_analysis": {
        "carry_on_transfer_mode": "passthrough",
        "inherited_basis": 1000000,
        "purchase_price": 2000000,
        "current_nav_slice": 2000000,
        "carry_rate": 0.20,
        "accrued_carry_burden": 200000,
        "carry_adjusted_nav": 1800000,
        "carry_recipients": [
          { "recipient": "deal_originator", "rate": 0.15, "amount": "150000" },
          { "recipient": "fund_gp", "rate": 0.05, "amount": "50000" }
        ]
      }
    }
  ],
  "legs": [
    {
      "from": "part-gp-a",
      "to": "part-buyer-001",
      "position_id": "pos-rd-gp-b-saronic",
      "fraction": 0.2,
      "consideration_usd": "2000000",
      "new_position_id": "pos-part-buyer-001-rd-gp-b-saronic"
    }
  ]
}

Verdict statuses

StatusMeaning
ALLOWEDAll checks pass, no conditions
CONDITIONALLY_ALLOWEDChecks pass but pending actions (consent, ROFR) must be resolved
BLOCKEDOne or more checks failed — transfer cannot proceed

Carry analysis

When a position has carry terms, the evaluate response includes a carry_analysis object on each verdict. This is always computed regardless of the carry_on_transfer mode — the buyer needs to see the carry economics before committing.

FieldDescription
carry_on_transfer_modeHow carry is treated on transfer: passthrough, crystallize_and_defer, or crystallize_and_settle
inherited_basisSeller's pro-rata cost basis on the transferred slice (the waterfall-visible basis)
purchase_priceWhat the buyer is paying (consideration_usd)
current_nav_sliceCurrent mark times the transfer fraction
carry_rateTotal carry rate (e.g. 0.20 = 20%)
accrued_carry_burdencarry_rate * (current_nav_slice - inherited_basis)
carry_adjusted_navcurrent_nav_slice - accrued_carry_burden — the effective value net of carry
carry_recipientsPer-recipient breakdown: deal originator, fund GP, etc.

For positions without carry terms, carry_analysis is null.


POST /v1/ioi/create

Submit an indication of interest for one or more positions. IOIs are non-binding expressions of intent.

Request

{
  "buyer": "part-buyer-001",
  "positions": [
    { "position_id": "pos-rd-gp-b-saronic", "amount_usd": "2000000" }
  ]
}

Response (201)

{
  "ioi_id": "ioi-001",
  "buyer": "part-buyer-001",
  "positions": [{ "position_id": "pos-rd-gp-b-saronic", "amount_usd": "2000000" }],
  "status": "submitted"
}

POST /v1/ioi/accept

Accept a submitted IOI. Requires authorization from the position owner or managing member.

Request

{
  "ioi_id": "ioi-001",
  "acceptors": ["part-gp-a"],
  "authorized_by": "part-gp-a"
}

Response

{
  "ioi_id": "ioi-001",
  "status": "accepted"
}

POST /v1/consent/request

Request consent from one or more parties in the consent chain. Creates pending consent records.

Request

{
  "transfer_id": "txn-001",
  "consent_chain": [
    {
      "party": "part-gp-a",
      "role": "managing_member",
      "required": true,
      "authority": "OA Section 9.4"
    }
  ]
}

Response (201)

{
  "transfer_id": "txn-001",
  "consents": [
    {
      "consent_id": "consent-001",
      "transfer_id": "txn-001",
      "party": "part-gp-a",
      "role": "managing_member",
      "required": true,
      "status": "pending",
      "authority": "OA Section 9.4"
    }
  ]
}

POST /v1/consent/approve

Grant or deny consent for a pending transfer.

Request

{
  "transfer_id": "txn-001",
  "party": "part-gp-a",
  "signer": "john-komkov",
  "approved": true,
  "authority": "Managing Member authorization"
}

Response

{
  "consent_id": "consent-001",
  "status": "granted",
  "all_granted": true
}

POST /v1/transfers/settle

Execute settlement for an evaluated transfer. All pending consents must be resolved first. Produces position mutations, generates a transfer agreement document, and records events in the audit chain.

Request

{
  "transfer_id": "txn-001",
  "settlements": [
    {
      "position_id": "pos-rd-gp-b-saronic",
      "from": "part-gp-a",
      "to": "part-buyer-001",
      "fraction": 0.2,
      "consideration_usd": "2000000"
    }
  ]
}

Response

{
  "transfer_id": "txn-001",
  "status": "settled",
  "document_id": "doc-ta-txn-001",
  "mutations": [
    {
      "position": "pos-rd-gp-b-saronic",
      "new_position": "pos-part-buyer-001-rd-gp-b-saronic",
      "from": "part-gp-a",
      "to": "part-buyer-001",
      "fraction": 0.2,
      "consideration_usd": "2000000"
    }
  ]
}

Settlement effects

  1. Seller position is reduced by the transferred fraction
  2. New buyer position is created with inherited economic rights
  3. Transfer agreement document is generated with SHA-256 content hash
  4. Audit events are recorded: position.transferred, position.registered, transfer.settled
Edit this page on GitHub

Last reviewed: March 24, 2026

Was this page helpful?