Examples

Practical examples for common Graph API queries. All examples use POST /api/graph with a JSON request body.

Basic Queries

Get all servicing loans

{
  "query": "{ loans(where: {status: {_eq: \"servicing\"}}, order_by: {name: asc}) { id name amount status rate date_maturity } }"
}

Get a specific loan by ID

{
  "query": "query GetLoan($id: uuid!) { loans_by_pk(id: $id) { id name amount status rate term frequency regular_payment date_maturity } }",
  "variables": { "id": "your-loan-id" }
}

Get all borrowers

{
  "query": "{ people(where: {is_borrower: {_eq: true}}, order_by: {name: asc}) { id name email phone status entity_type } }"
}

Filtering

Loans maturing in the next 90 days

{
  "query": "query ExpiringLoans($today: date!, $cutoff: date!) { loans(where: {status: {_eq: \"servicing\"}, date_maturity: {_gte: $today, _lte: $cutoff}}, order_by: {date_maturity: asc}) { id name amount date_maturity } }",
  "variables": {
    "today": "2025-01-01",
    "cutoff": "2025-04-01"
  }
}

Loans with amount greater than $500,000

{
  "query": "{ loans(where: {amount: {_gt: 500000}, status: {_eq: \"servicing\"}}) { id name amount rate status } }"
}

Search people by name (case-insensitive)

{
  "query": "{ people(where: {name: {_ilike: \"%smith%\"}}) { id name email phone is_borrower is_investor } }"
}

Relationships

Loans with their borrowers

{
  "query": "{ loans(where: {status: {_eq: \"servicing\"}}, limit: 20) { id name amount status borrows { person { id name email phone } } } }"
}

Loans with their documents

{
  "query": "{ loans(limit: 10) { id name loan_documents { document { id name status type uploaded_date } } } }"
}

Loans with addresses and valuations

{
  "query": "{ loans(limit: 10) { id name amount address_details { address { street1 city state zipcode valuations(order_by: {report_date: desc}, limit: 1) { value valuation_type report_date } } } } }"
}

Investor with their funding sources

{
  "query": "query InvestorPortfolio($id: uuid!) { people_by_pk(id: $id) { id name email funding_sources(order_by: {date_funded: desc}) { id class rate original_amount committed_amount date_funded loan { id name status } } } }",
  "variables": { "id": "your-investor-id" }
}

Pagination

Paginated loans (page 2, 25 per page)

{
  "query": "{ loans(limit: 25, offset: 25, order_by: {created_at: desc}) { id name amount status created_at } }"
}

Aggregations

Total loan portfolio summary

{
  "query": "{ loans_aggregate(where: {status: {_eq: \"servicing\"}}) { aggregate { count sum { amount } avg { rate } min { rate } max { rate } } } }"
}

Response:

{
  "data": {
    "loans_aggregate": {
      "aggregate": {
        "count": 142,
        "sum": { "amount": 47500000 },
        "avg": { "rate": 0.0925 },
        "min": { "rate": 0.06 },
        "max": { "rate": 0.15 }
      }
    }
  }
}

Count loans by status

{
  "query": "{ servicing: loans_aggregate(where: {status: {_eq: \"servicing\"}}) { aggregate { count } } closed: loans_aggregate(where: {status: {_eq: \"closed\"}}) { aggregate { count } } lead: loans_aggregate(where: {status: {_eq: \"lead\"}}) { aggregate { count } } }"
}

Payment totals for a loan

{
  "query": "query LoanPayments($loan_id: uuid!) { payments_aggregate(where: {loan_id: {_eq: $loan_id}, date_reversed: {_is_null: true}}) { aggregate { count sum { amount } } } }",
  "variables": { "loan_id": "your-loan-id" }
}

Combining Features

Full loan detail with all related data

{
  "query": "query FullLoanDetail($id: uuid!) { loans_by_pk(id: $id) { id name amount status rate term frequency date_maturity regular_payment borrows { person { id name email phone } } guarantees { person { id name email } } address_details { address { street1 city state zipcode insurances { carrier type coverage_amount expiration } valuations(order_by: {report_date: desc}, limit: 1) { value valuation_type report_date } } } payments(order_by: {date: desc}, limit: 5) { id date amount type method } schedules(where: {is_next: {_eq: true}}) { due principal interest balance } loan_documents { document { id name status type } } tasks(where: {status: {_neq: \"completed\"}}) { id name status date_due } comments(order_by: {created_at: desc}, limit: 5) { text created_at admin { name } } } }",
  "variables": { "id": "your-loan-id" }
}

Portfolio report: loans with balances and next payment

{
  "query": "{ loans(where: {status: {_eq: \"servicing\"}}, order_by: {name: asc}) { id name amount rate date_maturity borrows(limit: 1) { person { name } } schedules(where: {is_next: {_eq: true}}) { due principal interest balance } payments_aggregate(where: {date_reversed: {_is_null: true}}) { aggregate { sum { amount } } } } }"
}