DocumentationAPI Reference
Architecture

Database Schema

Comprehensive Prisma relational schema reference for users, contract documents, risks, solutions, and API credentials.

OutRiskAI utilizes PostgreSQL managed via Prisma ORM (prisma/schema.prisma). The database incorporates relational tables alongside vector extensions for semantic contract search.

To apply database migrations locally, run pnpm prisma migrate dev. To inspect the database using Prisma Studio, run pnpm prisma studio.

Core Entity Relationship Model

┌──────────────┐       1:N       ┌──────────────────┐
│     User     ├────────────────►│ ContractDocument │
└──────┬───────┘                 └────────┬─────────┘
       │ 1:N                              │ 1:N
       ▼                                  ▼
┌──────────────┐                 ┌──────────────────┐
│   ApiKey     │                 │   ContractRisk   │
└──────────────┘                 └────────┬─────────┘
                                          │ 1:N
                                          ▼
                                 ┌──────────────────┐
                                 │   RiskSolution   │
                                 └──────────────────┘

Primary Prisma Models

1. User (User)

Stores account identities, authentication credentials, and user roles:

model User {
  id            String             @id @default(cuid())
  name          String?
  email         String?            @unique
  emailVerified DateTime?
  image         String?
  password      String?
  role          Role               @default(USER)
  createdAt     DateTime           @default(now())
  updatedAt     DateTime           @updatedAt
  documents     ContractDocument[]
  apiKeys       ApiKey[]
}

enum Role {
  USER
  LAWYER
  ADMIN
}

2. Contract Document (ContractDocument)

Represents ingested contract assets, extracted text, metadata, and background processing states:

model ContractDocument {
  id           String         @id @default(cuid())
  userId       String
  title        String
  description  String?
  documentUrl  String
  documentText String         @db.Text
  status       DocumentStatus @default(PENDING)
  promisor     String?
  promisee     String?
  value        Float?
  createdAt    DateTime       @default(now())
  updatedAt    DateTime       @updatedAt
  user         User           @relation(fields: [userId], references: [id], onDelete: Cascade)
  risks        ContractRisk[]
}

enum DocumentStatus {
  PENDING
  ACCEPTED
  REJECTED
}

3. Contract Risk (ContractRisk)

Stores identified risk liabilities, original clause text, and severity ratings:

model ContractRisk {
  id         String         @id @default(cuid())
  documentId String
  title      String
  text       String         @db.Text
  severity   RiskSeverity   @default(MEDIUM)
  category   String?
  document   ContractDocument @relation(fields: [documentId], references: [id], onDelete: Cascade)
  solutions  RiskSolution[]
}

enum RiskSeverity {
  HIGH
  MEDIUM
  LOW
}

4. Risk Solution (RiskSolution)

Contains recommended alternative contract language and negotiation guidance for each risk:

model RiskSolution {
  id       String       @id @default(cuid())
  riskId   String
  solution String       @db.Text
  risk     ContractRisk @relation(fields: [riskId], references: [id], onDelete: Cascade)
}

5. API Key Credentials (ApiKey)

Stores hashed API secrets and permission scopes for the Public REST API:

model ApiKey {
  id        String   @id @default(cuid())
  userId    String
  name      String
  keyHash   String   @unique
  prefix    String
  scopes    String[] @default(["documents:read", "documents:write"])
  createdAt DateTime @default(now())
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

Next Steps

On this page