Skip to main content

Louie API

Query Louie's dealer intelligence from any tool. REST, JSON, instant responses. Build integrations, feed your DMS, or pull live market data into your own dashboards.

REST / JSON X-Louie-API-Key auth 100 req/day default 2 public unauthenticated endpoints TLS 1.3 in transit

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"
Key format: All keys begin with 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 StatusError CodeMeaning
400invalid_requestMissing or malformed request body. Check required fields.
401unauthorizedMissing or invalid X-Louie-API-Key header.
403forbiddenKey is valid but lacks permission for this endpoint or org.
404not_foundEndpoint does not exist. Check your path spelling and version prefix.
422validation_errorRequest parsed but failed validation. Response body contains field-level errors.
429daily_rate_limit_reachedDaily request quota exhausted. Resets at midnight UTC.
500internal_errorServer error. Retry with exponential backoff. Report persistent 500s to brian@louieauto.com.
503upstream_timeoutAI inference call exceeded timeout (30s). Common on complex multi-variable deal queries. Break into two sequential calls.

Platform Stats — No Auth Required

GET /api/public/stats ✓ No auth

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

GET /api/moat/public ✓ No auth

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

POST /api/v1/lender-route 🔑 Auth required

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.

FieldTypeDescription
beacon*integerCustomer FICO score (300–850)
down_payment*numberDown payment in USD
vehicle_price*numberVehicle selling price in USD
vehicle_type*string"car", "truck", "suv", "van"
known_issuesarrayOptional: "repo", "bk7", "bk13", "itin", "thin_file", "charge_off"
term_monthsintegerOptional: 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

POST /api/v1/stip-check 🔑 Auth required

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.

FieldTypeDescription
lender*stringLender name (e.g. "Westlake", "GLS", "CAC")
beacon*integerCustomer FICO score
known_issuesarraySame values as lender-route
income_typestring"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

POST /api/v1/gross-calc 🔑 Auth required

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

POST /api/v1/morning-briefing 🔑 Auth required

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.

FieldTypeDescription
rolestring"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

GET /api/v1/market-pulse 🔑 Auth required

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.