Lender adapter

K

Kestrel

Kestrel Lending Co.

Active on the rail
Brands
tradepay
Tiers served
prime, near_prime, sub_prime
APR band
10.0% – 25.0%
Envelope
$50k – $3500k
P95 SLA
824ms
Integration
API
Webhook
kestrel.example.com
Product id
lp_kestrel

Endpoints

How Kestrel plugs in

POST/api/v1/lenders/lp_kestrel/quote

EazePay POSTs the normalised applicant + bureau + bank snapshot. Kestrel's adapter responds with approve / decline / counter / ineligible inside its 824ms SLA.

POST/api/v1/webhooks/lenders/lp_kestrel

Kestrel posts lifecycle events back here: application.decisioned, offer.bound, loan.funded, loan.repaid, hardship.opened. HMAC-SHA256 signed.

GET/api/v1/applications/{id}/offers

Operator console fetches the consumer-best ranked offers, including Kestrel's when eligible.

Request from EazePay

What we send to your quote endpoint

request.jsonJSON
{
  "application_id": "app_4nqLkR2vTjW",
  "policy_version": "orch_v_2026_05_a",
  "snapshot_hash": "sha256:f4e9c1a2…",
  "applicant": {
    "state": "TX",
    "fico_band": "740-779",
    "income_monthly_cents": 684000,
    "dti_pct": 28.4,
    "cashflow_score": 0.84,
    "mla_covered": false,
    "scra_active": false
  },
  "request": {
    "amount_cents": 1850000,
    "term_months": 60,
    "category": "home_improvement"
  },
  "permissible_purpose": "604(a)(3)(A)"
}

Response shape we expect

What Kestrel responds with

response.jsonJSON
{
  "decision": "approved",
  "offer": {
    "offer_id": "off_00tm8it7",
    "application_id": "app_007iau2z",
    "lender_product_id": "lp_kestrel",
    "lender": "Kestrel",
    "lender_of_record": "Kestrel Lending Co.",
    "amount_cents": 1850000,
    "term_months": 60,
    "apr_bps": 1749,
    "fee_cents": 0,
    "monthly_payment_cents": 46466,
    "approval_likelihood": 0.78,
    "valid_until": "2026-07-31T04:25:52.145Z"
  },
  "reason_codes": [
    "approved_within_policy"
  ],
  "policy_version": "orch_v_2026_05_a",
  "valid_until": "2026-07-31T04:25:52.145Z"
}

Inbound webhook

Status events Kestrel posts back

webhook.jsonJSON
{
  "event_type": "loan.funded",
  "event_version": 1,
  "occurred_at": "2026-07-31T03:55:52.145Z",
  "data": {
    "loan_id": "loan_2KvN8aR",
    "offer_id": "off_00tm8it7",
    "rail": "rtp",
    "amount_cents": 1850000,
    "disbursed_at": "2026-07-31T03:55:52.145Z"
  }
}

Signing scheme

Every payload (inbound + outbound) is signed with HMAC-SHA256(secret, timestamp + '.' + nonce + '.' + body). Timestamp must be within a 5-minute window; nonce must be unique across the last 24 hours. Failed verification returns RFC 7807 401 signature_invalid with a human-readable detail.

Next step

Ready to bind Kestrel to your sandbox?

Generate sandbox keys, paste your webhook URL, and run the full test pack — quote, bind, fund, webhook back — in under 30 minutes.