/api/external/v2/deals/{deal_id}/term-sheets/api/external/v2/deals/{deal_id}/term-sheets/{term_sheet_id}/api/external/v2/deals/{deal_id}/term-sheets/api/external/v2/deals/{deal_id}/term-sheets/{term_sheet_id}/api/external/v2/deals/{deal_id}/term-sheets/{term_sheet_id}Overview
Term sheets are loan quotes attached to a placement on a deal. A deal can have many term sheets (one per quote received), and one can be marked as the winning quote.
| Endpoint | Description |
|---|---|
GET /deals/{deal_id}/term-sheets | List term sheets for a deal |
GET /deals/{deal_id}/term-sheets/{id} | Get a single term sheet |
POST /deals/{deal_id}/term-sheets | Create a new term sheet against a placement |
PATCH /deals/{deal_id}/term-sheets/{id} | Update a term sheet (partial update) |
DELETE /deals/{deal_id}/term-sheets/{id} | Soft-delete a term sheet (reversible by Lev support) |
placement_id and deal_id are set at create time and cannot be reassigned. To move a term sheet to a different placement, delete it and create a new one.
List Term Sheets
/api/external/v2/deals/{deal_id}/term-sheetsList term sheets for a deal
deal_idintegerrequiredlimitintegercursorstringResponse (200):
{
"request_id": "e7f8a9b0-c1d2-3456-0123-567890123456",
"timestamp": "2026-03-20T15:30:45Z",
"data": [
{
"id": 15,
"title": "JPMorgan Chase — Stabilized Multifamily",
"quote_type": "soft_quote",
"rate_type": "fixed",
"total_rate": 5.85,
"base_rate": "Treasury 5-Yr",
"initial_funding": 5000000,
"io_period": 24,
"max_ltv": 0.70,
"max_ltc": null,
"origination_fee": 0.01,
"term": 120,
"recourse": "non_recourse",
"org_id": 3200,
"placement_id": 310,
"winning": false,
"created_at": "2026-02-10T14:00:00Z",
"updated_at": "2026-03-01T09:15:00Z"
}
],
"pagination": {
"total": 3,
"limit": 50,
"has_more": false,
"next_cursor": null
}
}unauthorizednot_foundGet Term Sheet
/api/external/v2/deals/{deal_id}/term-sheets/{term_sheet_id}Get a single term sheet
deal_idintegerrequiredterm_sheet_idintegerrequiredResponse (200):
{
"request_id": "f8a9b0c1-d2e3-4567-1234-678901234567",
"timestamp": "2026-03-20T15:30:45Z",
"data": {
"id": 15,
"title": "JPMorgan Chase — Stabilized Multifamily",
"quote_type": "soft_quote",
"rate_type": "fixed",
"total_rate": 5.85,
"base_rate": "Treasury 5-Yr",
"initial_funding": 5000000,
"io_period": 24,
"max_ltv": 0.70,
"max_ltc": null,
"origination_fee": 0.01,
"term": 120,
"recourse": "non_recourse",
"org_id": 3200,
"placement_id": 310,
"winning": false,
"created_at": "2026-02-10T14:00:00Z",
"updated_at": "2026-03-01T09:15:00Z",
"capital_source_type": "balance_sheet",
"base_rate_value": 4.35,
"effective_spread": 1.50,
"recourse_type": "full",
"payment_method": "current_pay",
"prepayment_penalty": "yield_maintenance",
"prepayment_penalty_details": "Yield maintenance for first 7 years, 1% thereafter",
"amortization": 360,
"extension_one": 12,
"extension_two": null,
"extension_three": null,
"floor": 5.00,
"floor_type": "total_rate",
"good_faith_deposit": 50000.0,
"min_dscr": 1.25,
"min_debt_yield": 0.08,
"ir_details": null,
"notes": "Subject to property inspection and environmental review"
}
}unauthorizednot_foundCreate Term Sheet
/api/external/v2/deals/{deal_id}/term-sheetsCreate a new term sheet against a placement
Supports the Idempotency-Key header to prevent duplicate creation. Requires the termsheets:write scope.
deal_idintegerrequiredplacement_idintegerrequiredtotal_ratenumberrequiredinitial_fundingintegerrequiredquote_typestringrequiredrate_typestringrequiredtitlestringwinningbooleanis_visible_to_borrowerbooleanbase_ratestringmax_ltvnumbermax_ltcnumberadditional_fundingintegerfloornumberfloor_typestringtermintegeramortizationintegerio_periodintegerextension_oneintegerextension_twointegerextension_threeintegerrecoursestringrecourse_typestringprepayment_penaltystringprepayment_penalty_detailsstringmin_dscrnumbermin_debt_yieldnumberorigination_feenumberextension_feenumberexit_feenumbergood_faith_depositnumbernotesstringir_detailsstringpayment_methodstringcapital_source_typestringSee Enums for the full list of valid values for each enum field.
The list and detail endpoints filter out term sheets whose quote_type is not in the default-visible set or whose is_visible_to_borrower is false. A successful create followed by a GET returning 404 means the row exists but is hidden by policy — re-check the quote_type and is_visible_to_borrower values you sent.
curl -X POST "https://api.lev.com/api/external/v2/deals/101/term-sheets" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-d '{
"placement_id": 310,
"total_rate": 5.85,
"initial_funding": 5000000,
"quote_type": "soft_quote",
"rate_type": "fixed",
"base_rate": "treasury_y5",
"term": 120,
"io_period": 24,
"max_ltv": 0.70,
"recourse": "non_recourse",
"origination_fee": 0.01,
"title": "JPMorgan Chase — Stabilized Multifamily"
}'Response (201): returns the full term-sheet detail object (see Term Sheet Object).
unauthorizednot_foundnot_foundvalidation_errorvalidation_errorUpdate Term Sheet
/api/external/v2/deals/{deal_id}/term-sheets/{term_sheet_id}Update a term sheet (partial update)
Supports the Idempotency-Key header. Requires the termsheets:write scope. Send only the fields you want to change — at least one body field is required.
deal_idintegerrequiredterm_sheet_idintegerrequiredplacement_id and deal_id are locked at create time and cannot be reassigned — to move a term sheet to a different placement, delete it and create a new one.
titlestringwinningbooleantotal_ratenumberinitial_fundingintegerquote_typestringrate_typestringbase_ratestring|nullmax_ltvnumbermax_ltcnumberadditional_fundingintegerfloornumberfloor_typestringtermintegeramortizationintegerio_periodintegerextension_oneintegerextension_twointegerextension_threeintegerrecoursestringrecourse_typestringprepayment_penaltystringprepayment_penalty_detailsstringmin_dscrnumbermin_debt_yieldnumberorigination_feenumberextension_feenumberexit_feenumbergood_faith_depositnumbernotesstringir_detailsstringis_visible_to_borrowerbooleanpayment_methodstringcapital_source_typestringSee Enums for the full list of valid values for each enum field.
Special handling for boolean fields. Sending winning: null or is_visible_to_borrower: null returns 422 — these fields require an explicit boolean. Omit the field to leave it unchanged, or send true/false.
Special handling for base_rate. Most fixed-rate quotes still reference a benchmark (e.g. treasury_y5 for "Treasury 5-Yr + spread") — pair rate_type: "fixed" with the benchmark name. Use the literal string "none-fixed" only when the lender quoted a flat rate with no underlying index reference. Sending base_rate: null clears any existing value.
curl -X PATCH "https://api.lev.com/api/external/v2/deals/101/term-sheets/15" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"total_rate": 5.95,
"winning": true,
"notes": "Lender raised rate by 10bps after market move; deal team flagged as winning"
}'Response (200): returns the updated term-sheet detail object.
bad_requestunauthorizednot_foundvalidation_errorvalidation_errorDelete Term Sheet
/api/external/v2/deals/{deal_id}/term-sheets/{term_sheet_id}Soft-delete a term sheet
Soft delete — the term sheet is marked deleted and excluded from subsequent reads, but can be restored by Lev support. Requires the termsheets:write scope.
deal_idintegerrequiredterm_sheet_idintegerrequiredcurl -X DELETE "https://api.lev.com/api/external/v2/deals/101/term-sheets/15" \
-H "Authorization: Bearer YOUR_API_KEY"Response (200):
{
"request_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"timestamp": "2026-05-19T15:30:45Z",
"data": {
"deleted": true
}
}unauthorizednot_foundTerm Sheet Object
The list endpoint returns a summary response, while the detail endpoint returns additional fields.
Summary Fields (List + Detail)
| Field | Type | Description |
|---|---|---|
id | integer | Term sheet identifier |
deal_id | integer|null | Deal this term sheet belongs to |
title | string|null | Term sheet title |
quote_type | string|null | Quote type (guidance, indication, soft_quote, hard_quote, term_sheet) |
initial_funding | integer|null | Initial funding amount |
total_rate | number|null | All-in total rate |
base_rate | string|null | Display value of the base rate (e.g. Treasury 5-Yr, SOFR 30-Day Avg) or none-fixed |
rate_type | string|null | Rate type (fixed, floating) |
term | integer|null | Loan term in months |
io_period | integer|null | Interest-only period in months |
recourse | string|null | Recourse type |
max_ltv | number|null | Maximum Loan-to-Value ratio |
max_ltc | number|null | Maximum Loan-to-Cost ratio |
origination_fee | number|null | Origination fee as a decimal ratio |
exit_fee | number|null | Exit fee as a decimal ratio |
org_id | integer|null | Lender organization ID |
placement_id | integer|null | Associated placement ID |
winning | boolean|null | Whether this is the winning term sheet |
is_visible_to_borrower | boolean | Whether the term sheet is visible to the borrower |
created_at | string|null | Creation timestamp |
updated_at | string|null | Last update timestamp |
Additional Detail Fields (Detail Only)
These fields are only returned by the GET /deals/{deal_id}/term-sheets/{id} endpoint:
| Field | Type | Description |
|---|---|---|
capital_source_type | string|null | Capital source type |
base_rate_value | number|null | Base rate numeric value |
effective_spread | number|null | Effective spread over index |
recourse_type | string|null | Recourse type detail |
payment_method | string|null | Payment method |
prepayment_penalty | string|null | Prepayment penalty type |
prepayment_penalty_details | string|null | Prepayment penalty details |
amortization | integer|null | Amortization period in months |
extension_one | integer|null | First extension option (months) |
extension_two | integer|null | Second extension option (months) |
extension_three | integer|null | Third extension option (months) |
floor | number|null | Rate floor |
floor_type | string|null | Floor type |
good_faith_deposit | number|null | Good faith deposit amount |
min_dscr | number|null | Minimum DSCR requirement |
min_debt_yield | number|null | Minimum debt yield requirement |
ir_details | string|null | Interest reserve details |
notes | string|null | Additional notes |
Enums
All enum values are lowercase on the wire. Unknown values return 422 with the full list of valid options.
| Field | Valid values |
|---|---|
quote_type | guidance, indication, soft_quote, hard_quote, term_sheet |
rate_type | fixed, floating |
recourse | personal_recourse, fund_corporate_recourse, non_recourse |
recourse_type | full, partial, burn_off |
floor_type | base_rate, total_rate |
prepayment_penalty | step_down, defeasance, minimum_interest, yield_maintenance, minimum_multiple, swap_breakage, no_prepayment_penalty, no_ability_to_prepay, flat_fee, other |
payment_method | accrued, partial, current_pay |
capital_source_type | balance_sheet, agency, cmbs_clo, warehouse, sba |
base_rate | Either an enum key (e.g. treasury_y5, sofr_m1, prime_rate) or the matching display value returned by GET /market/base-rates (e.g. Treasury 5-Yr, SOFR 30-Day Avg, Prime Rate). Both forms are accepted on write. Use the literal none-fixed for fixed-rate quotes with no underlying benchmark |