Curvestone
POST/check

AI Packager — Lender Gateway

Auto-check cases against your lending criteria before they reach your underwriters.

Who is this for

Lender Integration Team / Head of Operations at a mortgage lender. You receive hundreds of broker-submitted applications daily via your CRM. Most don't meet your specific lending criteria and waste underwriter time. You want Curvestone to sit between the broker and your underwriting desk, auto-checking every case and rejecting ones that don't meet criteria before a human ever sees them.

What you'll do

  • 1
    Configure your lender-specific criteria profile with Curvestone
  • 2
    Integrate the API into your case intake pipeline
  • 3
    Every inbound case gets auto-checked against your 500+ lending criteria
  • 4
    Cases that fail get auto-rejected with specific reasons; the broker is notified
  • 5
    Only clean, criteria-matching cases reach your underwriters

The API call

Every inbound case from your broker portal triggers a lender_criteria depth check against your lender profile. The on_reject field configures automatic broker notification when a case fails.

ai_packager.py
python
from curvestone import Agent
agent = Agent() # reads CURVESTONE_API_KEY from env
# Every inbound case from your portal triggers this
result = agent.check(
case_type="residential_mortgage",
depth="lender_criteria",
modifiers=["interest_only", "remortgage"],
documents=[
open("application_pack.pdf", "rb"),
open("fact_find.pdf", "rb"),
],
reference="APP-2026-14221",
lender_profile="lender_natwest_v2026",
metadata={
"source": "broker_portal",
"broker_firm": "premier_mortgages",
"submitted_via": "crm_integration",
},
on_reject={
"notify": "broker",
"method": "email", # or "api_callback"
"template": "criteria_rejection",
},
)
print(f"Triage: {result.triage}")
print(f"Checked: {result.criteria_checked}")
print(f"Failed: {result.criteria_failed}")

Response — rejected case

When a case fails lending criteria, you get the specific rules that weren't met and the broker is notified automatically.

response_rejected.json
json
1{
2 "id": "job_8kTx3mNpQ7",
3 "type": "check",
4 "status": "completed",
5 "triage": "rejected",
6 "reference": "APP-2026-14221",
7 "processing_time": "45s",
8 "lender_profile": "lender_natwest_v2026",
9 "criteria_checked": 247,
10 "criteria_passed": 241,
11 "criteria_failed": 6,
12 "rejections": [
13 {
14 "criteria": "Maximum LTV for Interest Only",
15 "policy": "Max 75% LTV for interest only remortgages",
16 "actual": "82% LTV",
17 "status": "fail"
18 },
19 {
20 "criteria": "Interest Only Repayment Vehicle",
21 "policy": "Acceptable vehicles: pension, investments, property sale",
22 "actual": "No repayment vehicle documented",
23 "status": "fail"
24 }
25 ],
26 "notification": {
27 "sent_to": "[email protected]",
28 "method": "email",
29 "template": "criteria_rejection",
30 "sent_at": "2026-02-21T14:32:00Z"
31 },
32 "cost": "£3.00"
33}

Response — passing case

When a case meets all criteria, it is forwarded straight to your underwriting queue.

response_passed.json
json
1{
2 "id": "job_4nRy7kLpM2",
3 "type": "check",
4 "status": "completed",
5 "triage": "pass",
6 "reference": "APP-2026-14222",
7 "processing_time": "42s",
8 "lender_profile": "lender_natwest_v2026",
9 "criteria_checked": 247,
10 "criteria_passed": 247,
11 "criteria_failed": 0,
12 "forwarded_to": "underwriting_queue",
13 "cost": "£3.00"
14}

What happens

Lender criteria, not compliance

The lender_criteria depth checks against the lender's specific policy document — their Knowledge Bank criteria, which can include 500+ rules per lender. Unlike compliance checks which assess regulatory adherence, criteria matching checks whether the case meets the lender's commercial lending policy.

Auto-rejection with specific reasons

Cases that fail are auto-rejected with the specific criteria that weren't met. The rejections array lists each failed rule, the lender's policy statement, and the actual value found in the application — giving the broker a clear picture of what went wrong.

Broker notification closes the loop

The on_reject configuration sends an automatic notification to the broker explaining exactly what's wrong, so they can fix and resubmit or try a different lender. This eliminates the back-and-forth that wastes underwriter time. You can choose email or API callback depending on your integration.

Only clean cases reach underwriters

Passing cases are forwarded directly to your underwriting queue. Your underwriters only see applications that have already been validated against every criteria rule, so they can focus on credit assessment and judgment calls rather than manually checking whether basic lending criteria are met.