Authentication
Two separate key schemes exist today, scoped to different endpoint groups below. Both are issued per dealer account, hashed (SHA-256) at rest — the raw key is shown exactly once on creation — and scoped to a single dealer org.
Dealer Intelligence endpoints (Lender Route, Stip Check, Gross Calc, Morning Briefing, Market Pulse) use the X-Louie-API-Key header, key prefix lak_:
curl https://louieauto.com/api/v1/market-pulse \
-H "X-Louie-API-Key: lak_xxxxxxxxxxxxxxxxxxxxxxxx"
Read-Only Feed endpoints (Inventory, Sales Summary) use the X-Api-Token header, key prefix louie_live_:
curl https://louieauto.com/api/v1/inventory \
-H "X-Api-Token: louie_live_xxxxxxxxxxxxxxxxxxxxxxxx"
Rate Limits
lak_ keys (Dealer Intelligence endpoints): 100 requests/day by default, tracked per key and reset daily. Exceeding it returns HTTP 429 with {"error":"daily rate limit reached"}. Higher limits available on request.
louie_live_ tokens (Read-Only Feed endpoints): no per-token quota is enforced today.
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 or X-Api-Token header (whichever your endpoint requires). |
| 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 | lak_ key's daily 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, distinct organizations represented in routing data, and total deals routed through the AI matching engine.
curl https://louieauto.com/api/public/stats
Response:
{
"demo_sessions": 127,
"unique_orgs": 29,
"deals_through_ai": 13046,
"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"
}
]
}
Inventory
Returns your dealership's current inventory (up to 500 units), ordered by days in stock. Scoped to your org only.
curl https://louieauto.com/api/v1/inventory \
-H "X-Api-Token: $LOUIE_KEY"
Response:
{
"count": 214,
"inventory": [
{ "stock_number": "A1042", "vin": "1G1...", "year": 2020, "make": "Chevrolet",
"model": "Equinox", "trim": "LT", "condition": "used", "days_in_stock": 67,
"asking_price": 24995, "store": "Main St" }
]
}
Sales Summary
Returns unit counts and total gross by store and month (up to 200 rows), most recent first. Scoped to your org only.
curl https://louieauto.com/api/v1/sales-summary \
-H "X-Api-Token: $LOUIE_KEY"
Response:
{
"count": 12,
"salesSummary": [
{ "store": "Main St", "saleMonth": "2026-04", "units": 38, "totalGross": 142500 }
]
}
Lender Route
Routes a deal profile against the same real 53-lender matrix used inside the app.
| 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 required stips for a given lender/FICO/profile combination.
| 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
Computes true-cost gross for a given purchase/selling price and holding time.
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
}
Morning Briefing
Returns the same aged-inventory morning briefing shown inside the app.
| Field | Type | Description |
|---|---|---|
| role | string | "new_car_manager" for the new-car-focused briefing; any other value (or omitted) returns the used-car-manager briefing. |
curl -X POST https://louieauto.com/api/v1/morning-briefing \
-H "X-Louie-API-Key: $LOUIE_KEY" \
-H "Content-Type: application/json" \
-d '{ "role": "new_car_manager" }'
Response:
{
"alerts": [
{
"stock_no": "A1042",
"year": 2020, "make": "Chevrolet", "model": "Equinox",
"days_on_lot": 67,
"list_price": 24995,
"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, and key market alerts. Illustrative today — goes live from real aggregated dealer-network data as the Louie Network grows (see the public preview).
curl https://louieauto.com/api/v1/market-pulse \
-H "X-Louie-API-Key: $LOUIE_KEY"
Webhooks
Not yet available on the public API — subscribing your endpoint to real dealer events (deal created/closed, inventory updated, new lead/customer) is on the roadmap. Email brian@louieauto.com if this is a blocker for your integration.
JavaScript SDK
The official LouieAuto SDK wraps all API endpoints with proper error handling, retry logic, and TypeScript-compatible types.
<!-- Browser -->
<script src="https://louieauto.com/js/louieauto-sdk.js"></script>
// Initialize
const louie = new LouieAuto({ apiKey: 'YOUR_API_KEY' });
// Route a lender
const result = await louie.routeLender({ beacon: 580, down_payment: 1500, vehicle_price: 14000, vehicle_type: 'car' });
// Check stips
const stips = await louie.stipCheck({ lender: 'Westlake', beacon: 580 });
// True-cost gross calc
const gross = await louie.grossCalc({ purchase_price: 14000, vehicle_type: 'car', days_on_lot: 12, selling_price: 17500 });
Full SDK reference and partner program →
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_morning_briefing(role: str = None) -> dict:
r = httpx.post(
f"{BASE}/morning-briefing",
headers={"X-Louie-API-Key": LOUIE_KEY},
json={"role": role} if role else {},
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
lak_ keys are created per dealer account by a logged-in staff member — POST /api/public-api/keys while authenticated in the app, or by contacting the team directly. Each key is scoped to a single dealer organization and cannot cross org boundaries.
curl -X POST https://louieauto.com/api/public-api/keys \
--cookie "your-session-cookie" \
-H "Content-Type: application/json" \
-d '{ "label": "My Integration", "permissions": "read", "rate_limit": 100 }'
Response includes the raw key exactly once. Store it immediately — it cannot be retrieved later. Lost keys must be revoked and reissued.
Request an API key →Integration support: brian@louieauto.com — response within 1 business day.