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 for multi-rooftop deployments — 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,
"simulated_dealerships": 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
}
Morning Briefing
Generates an AI morning briefing for your store — used-car manager focus (aged inventory, market moves, lender intel, equity pipeline) by default, or a new-car-manager focus (allocation, stair-step, lease returns, expiring incentives) when requested.
| 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
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": "legacy CRM software 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.