Authentication
All /api/v1/* endpoints require the X-Louie-API-Key header. Keys are issued per dealer account, hashed (SHA-256) at rest — the raw key is shown exactly once on creation. Keys are scoped to a single dealer org and cannot cross-access another org's data.
curl https://louieauto.com/api/v1/market-pulse \
-H "X-Louie-API-Key: lak_xxxxxxxxxxxxxxxxxxxxxxxx"
lak_ (Louie API Key). If your key doesn't start with this prefix, it was issued under an older scheme — request a replacement via brian@louieauto.com.Rate Limits
Default: 100 requests/day per key across all authenticated endpoints. Limits reset at midnight UTC. Unauthenticated public endpoints have their own generous limits and are not counted against your key quota.
Higher limits available on Power Dealer and Dealer Group tiers — contact brian@louieauto.com. Exceeding the limit returns:
HTTP 429 Too Many Requests
{"error":"daily_rate_limit_reached","reset_at":"2026-05-03T00:00:00Z","limit":100,"used":100}
The X-Louie-RateLimit-Remaining response header tells you how many requests are left in the current day.
Base URL & Versioning
All authenticated endpoints are versioned under /api/v1/. Public endpoints live at /api/public/ and /api/moat/. The current stable version is v1.
Base URL: https://louieauto.com
Auth endpoints: /api/v1/*
Public endpoints: /api/public/* and /api/moat/*
Breaking changes will be announced via the /changelog at least 30 days before deprecation, and will move to a new version prefix (/api/v2/) without removing the prior version immediately.
Error Codes
| HTTP Status | Error Code | Meaning |
|---|---|---|
| 400 | invalid_request | Missing or malformed request body. Check required fields. |
| 401 | unauthorized | Missing or invalid X-Louie-API-Key header. |
| 403 | forbidden | Key is valid but lacks permission for this endpoint or org. |
| 404 | not_found | Endpoint does not exist. Check your path spelling and version prefix. |
| 422 | validation_error | Request parsed but failed validation. Response body contains field-level errors. |
| 429 | daily_rate_limit_reached | Daily request quota exhausted. Resets at midnight UTC. |
| 500 | internal_error | Server error. Retry with exponential backoff. Report persistent 500s to brian@louieauto.com. |
| 503 | upstream_timeout | AI inference call exceeded timeout (30s). Common on complex multi-variable deal queries. Break into two sequential calls. |
Platform Stats — No Auth Required
Returns live platform-level statistics: demo sessions started, organizations that have evaluated the platform, total deals through AI routing, and active rooftop count. Used by the homepage live counter.
curl https://louieauto.com/api/public/stats
Response:
{
"demo_sessions": 127,
"organizations_evaluated": 29,
"deals_through_ai": 1167,
"active_rooftops": 5,
"uptime_pct_90d": 99.9,
"last_updated": "2026-05-02T07:02:00Z"
}
Market Intel Feed — No Auth Required
Returns the 20 most recent market intelligence entries from Louie's moat builder: macro signals (FRED, EIA gas price, UMich consumer sentiment), lender environment flags, Manheim index readings, and any active dealer-market alerts. Refreshed nightly.
curl https://louieauto.com/api/moat/public
Response (truncated):
{
"count": 20,
"last_refresh": "2026-05-02T02:15:00Z",
"entries": [
{
"id": "moat_1234",
"category": "lender_environment",
"signal": "Ally Financial tightened subprime thresholds — avoid sub-580 FICO this week",
"severity": "high",
"source": "CFPB complaint spike + lender press release",
"date": "2026-05-01"
},
{
"id": "moat_1233",
"category": "macro",
"signal": "UMich consumer sentiment: 67.4 — flat MoM. No urgency signal.",
"severity": "low",
"source": "University of Michigan Surveys of Consumers",
"date": "2026-05-01"
}
]
}
Lender Route
Returns the primary lender, backup, expected rate range, lenders to avoid, and predicted stips for a given deal profile. Based on the 42-lender matrix calibrated to your store's funded deal history.
| Field | Type | Description |
|---|---|---|
| beacon* | integer | Customer FICO score (300–850) |
| down_payment* | number | Down payment in USD |
| vehicle_price* | number | Vehicle selling price in USD |
| vehicle_type* | string | "car", "truck", "suv", "van" |
| known_issues | array | Optional: "repo", "bk7", "bk13", "itin", "thin_file", "charge_off" |
| term_months | integer | Optional: desired term (24, 36, 48, 60, 72, 84) |
curl -X POST https://louieauto.com/api/v1/lender-route \
-H "X-Louie-API-Key: $LOUIE_KEY" \
-H "Content-Type: application/json" \
-d '{
"beacon": 580,
"down_payment": 1500,
"vehicle_price": 14000,
"vehicle_type": "car",
"known_issues": ["repo"]
}'
Response:
{
"primary": { "lender": "GLS", "rate_range": "18–22%", "confidence": 0.84 },
"backup": { "lender": "Westlake", "rate_range": "19–24%", "confidence": 0.71 },
"avoid": ["Ally", "Flagship"],
"avoid_reason": "Ally tightened sub-600 thresholds this week. Flagship complaint rate elevated.",
"predicted_stips": ["Proof of income (2 months)", "Proof of residence", "Reference list"],
"routing_note": "Repo within 24 months: GLS has best approval rate (84%) on this profile in your store history."
}
Stip Check
Predicts the exact stips a specific lender will require for a given customer profile, before you call. Cuts stip fall-through by pre-staging the correct documentation.
| Field | Type | Description |
|---|---|---|
| lender* | string | Lender name (e.g. "Westlake", "GLS", "CAC") |
| beacon* | integer | Customer FICO score |
| known_issues | array | Same values as lender-route |
| income_type | string | "w2", "self_employed", "itin", "fixed" |
curl -X POST https://louieauto.com/api/v1/stip-check \
-H "X-Louie-API-Key: $LOUIE_KEY" \
-H "Content-Type: application/json" \
-d '{ "lender": "Westlake", "beacon": 540, "known_issues": ["repo"], "income_type": "w2" }'
Response:
{
"lender": "Westlake",
"required_stips": [
{ "stip": "Last 2 pay stubs", "priority": "required" },
{ "stip": "3 months bank statements", "priority": "required" },
{ "stip": "Proof of residence (utility bill within 60 days)", "priority": "required" },
{ "stip": "Reference list (3 local, with phone numbers)", "priority": "likely" }
],
"submission_tip": "Westlake routes repo cases through secondary review — submit complete package first call. Incomplete packages go to the bottom of the queue.",
"avg_turnaround_hours": 4
}
Gross Calc
Pack-aware true-cost-basis and potential gross calculation. Accounts for your store's configured pack, days-on-lot holding cost, and standard reconditioning allocation.
curl -X POST https://louieauto.com/api/v1/gross-calc \
-H "X-Louie-API-Key: $LOUIE_KEY" \
-H "Content-Type: application/json" \
-d '{
"purchase_price": 18000,
"vehicle_type": "car",
"days_on_lot": 42,
"selling_price": 22500
}'
Response:
{
"true_cost": 19240,
"holding_cost_allocated": 420,
"pack": 800,
"front_gross": 3260,
"front_gross_pct": 14.5,
"pricing_recommendation": "On track — this unit is priced within 3% of the 30-day market median for this segment in your market.",
"aged_flag": false
}
Deal Coach
Submits a deal scenario and returns Louie's structured recommendation: optimal pencil, F&I product recommendations, objection word tracks, and a funding-risk flag. Designed for desk managers to run before the customer sits down.
curl -X POST https://louieauto.com/api/v1/deal-coach \
-H "X-Louie-API-Key: $LOUIE_KEY" \
-H "Content-Type: application/json" \
-d '{
"beacon": 620,
"vehicle_price": 26500,
"trade_value": 8000,
"trade_payoff": 5500,
"down_payment": 2000,
"desired_payment": 450,
"term_months": 72
}'
Response:
{
"recommended_pencil": {
"selling_price": 26200,
"rate": 9.9,
"term": 72,
"payment": 447,
"front_gross": 1600,
"back_gross_target": 2200
},
"fi_products": [
{ "product": "VSC (72-month)", "penetration_rate": 0.74, "objection": "Payment goes up $28/mo but covers any repair over $100 — you're driving a $26K vehicle." },
{ "product": "GAP", "penetration_rate": 0.88, "objection": "With $2K down and a $5.5K payoff, you're upside down for 18 months. GAP is $9/mo." }
],
"funding_risk": "low",
"notes": "620 beacon on a 72-month pulls better at Capital One or TD Auto. Avoid 84-month on this profile — backend reserve will be capped."
}
Trade Appraisal
Submits vehicle description and condition notes (or base64-encoded photos if using the vision path) and returns a max acquisition number, recon estimate by line item, and a negotiation floor. The vision path processes photos taken on any smartphone.
curl -X POST https://louieauto.com/api/v1/trade-appraisal \
-H "X-Louie-API-Key: $LOUIE_KEY" \
-H "Content-Type: application/json" \
-d '{
"year": 2019,
"make": "Ford",
"model": "F-150",
"trim": "XLT",
"mileage": 87000,
"condition_notes": "Minor door ding passenger side. Cracked windshield. Interior clean.",
"market_zip": "60601"
}'
Response:
{
"max_acquisition": 18400,
"negotiation_floor": 16800,
"market_value_estimate": 22500,
"recon_estimate": {
"windshield_replacement": 350,
"door_ding_repair": 180,
"detail": 120,
"total": 650
},
"market_note": "F-150 XLT 2019 with 85–90K miles is running $21,500–$23,500 retail in ZIP 60601. 30-day supply is 12 days — fast mover.",
"confidence": "medium"
}
"photos": ["data:image/jpeg;base64,..."] in addition to or instead of condition_notes. Up to 6 photos accepted. Vision path increases confidence from medium to high on most units.Morning Briefing
Generates a role-aware morning briefing for your store. GM gets aged inventory, lender flags, and funding pipeline. Used-car manager gets acquisition targets and wholesale recommendations. F&I director gets stip and funding-risk alerts.
| Field | Type | Description |
|---|---|---|
| role* | string | "gm", "used_car_manager", "fi_director", "bdc_manager", "sales_manager" |
| store_id | string | Optional. Defaults to your primary store if omitted. |
curl -X POST https://louieauto.com/api/v1/morning-briefing \
-H "X-Louie-API-Key: $LOUIE_KEY" \
-H "Content-Type: application/json" \
-d '{ "role": "gm" }'
Inventory Alerts
Returns a list of active inventory alerts: aged units past your threshold, units priced above market, units with equity below floor plan cost, and wholesale candidates. Refreshed daily from your DMS feed.
curl https://louieauto.com/api/v1/inventory-alerts \
-H "X-Louie-API-Key: $LOUIE_KEY"
Response:
{
"alerts": [
{
"stock_no": "A1042",
"year": 2020, "make": "Chevrolet", "model": "Equinox",
"days_on_lot": 67,
"list_price": 19995,
"market_value": 18200,
"alert_type": "aged_and_overpriced",
"recommendation": "Reprice to $18,490 or wholesale. Holding cost: $28/day.",
"wholesale_est": 15800
}
],
"total_aged_units": 8,
"total_aged_exposure_usd": 186400
}
Market Pulse
Current consumer sentiment, lender environment, gas price, and key market alerts — auto-refreshed nightly by Louie's moat builder from FRED, EIA, UMich, and Manheim public data feeds.
curl https://louieauto.com/api/v1/market-pulse \
-H "X-Louie-API-Key: $LOUIE_KEY"
Compliance Check
Runs OFAC SDN screening, Red Flags Rule check, and FTC Safeguards validation on a customer record before deal submission. Returns a pass/flag/hold result with the specific rule triggered.
curl -X POST https://louieauto.com/api/v1/compliance-check \
-H "X-Louie-API-Key: $LOUIE_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"last_name": "Smith",
"dob": "1985-03-14",
"ssn_last4": "4821",
"address_zip": "60601"
}'
Response:
{
"result": "pass",
"ofac_match": false,
"red_flags": [],
"safeguards_flags": [],
"checked_at": "2026-05-02T11:34:22Z",
"check_id": "chk_8f2a4c91"
}
"hold" result: Do not proceed with the deal. The triggered_rule field identifies the specific flag. All holds are logged in your audit trail. Contact your compliance officer before proceeding. Louie does not make the compliance decision — it surfaces the flag.Webhooks
Louie can push events to your endpoint via HTTP POST when key platform events occur. Configure your webhook URL in the admin panel or via the broker token API.
Supported event types:
| Event | When it fires |
|---|---|
| morning_briefing.ready | Nightly briefing generated for each role, ready to pull or push to Slack/Teams |
| deal.stip_alert | A deal in the funding pipeline has a new stip or a stip has been cleared |
| inventory.aged_alert | A unit crossed the aged-inventory threshold (configurable, default 45 days) |
| lender.environment_change | Louie's moat builder detects a material lender environment shift (tightening, CFPB spike) |
| compliance.hold_triggered | A compliance check returned a hold result — high priority, requires human review |
Webhook payload example:
POST https://your-endpoint.com/louie-webhook
Content-Type: application/json
X-Louie-Signature: sha256=...
{
"event": "inventory.aged_alert",
"org_id": "org_4f2c",
"store_id": "store_main",
"timestamp": "2026-05-02T06:00:00Z",
"data": {
"stock_no": "A1042",
"days_on_lot": 67,
"recommendation": "Reprice to $18,490 or wholesale."
}
}
Verify the X-Louie-Signature header against your webhook secret to confirm the payload origin. Louie retries failed deliveries 3 times with exponential backoff over 24 hours.
Node.js Example
import fetch from 'node-fetch';
const LOUIE_KEY = process.env.LOUIE_API_KEY;
async function routeLender({ beacon, downPayment, vehiclePrice, vehicleType, knownIssues = [] }) {
const res = await fetch('https://louieauto.com/api/v1/lender-route', {
method: 'POST',
headers: {
'X-Louie-API-Key': LOUIE_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
beacon,
down_payment: downPayment,
vehicle_price: vehiclePrice,
vehicle_type: vehicleType,
known_issues: knownIssues,
}),
});
if (!res.ok) {
const err = await res.json();
throw new Error(`Louie API error: ${err.error}`);
}
return res.json();
}
// Usage
const routing = await routeLender({
beacon: 580,
downPayment: 1500,
vehiclePrice: 14000,
vehicleType: 'car',
knownIssues: ['repo'],
});
console.log(`Primary lender: ${routing.primary.lender} at ${routing.primary.rate_range}`);
Python Example
import os
import httpx
LOUIE_KEY = os.environ["LOUIE_API_KEY"]
BASE = "https://louieauto.com/api/v1"
def stip_check(lender: str, beacon: int, known_issues: list[str] = None) -> dict:
r = httpx.post(
f"{BASE}/stip-check",
headers={"X-Louie-API-Key": LOUIE_KEY},
json={"lender": lender, "beacon": beacon, "known_issues": known_issues or []},
timeout=30,
)
r.raise_for_status()
return r.json()
def get_inventory_alerts() -> dict:
r = httpx.get(
f"{BASE}/inventory-alerts",
headers={"X-Louie-API-Key": LOUIE_KEY},
timeout=30,
)
r.raise_for_status()
return r.json()
# Usage
stips = stip_check("Westlake", 540, ["repo"])
for s in stips["required_stips"]:
print(f"[{s['priority'].upper()}] {s['stip']}")
Get an API Key
Keys are created per dealer account via the broker token endpoint or by contacting the team directly. Each key is scoped to a single dealer organization and cannot cross org boundaries.
Broker token key creation:
curl -X POST https://louieauto.com/api/public-api/keys \
-H "Authorization: Bearer $YOUR_BROKER_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "label": "DriveCentric Integration", "rate_limit": 1000, "scopes": ["lender-route", "stip-check"] }'
Response includes the raw key exactly once. Store it immediately — it cannot be retrieved later. Lost keys must be revoked and reissued. Scopes are optional; omitting them grants full read access for the org.
Request an API key →Integration support: brian@louieauto.com — response within 1 business day.