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

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"
Not sure which key you have? Check the prefix on the raw key you were issued. If you need one you don't have, request it via brian@louieauto.com.

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 StatusError CodeMeaning
400invalid_requestMissing or malformed request body. Check required fields.
401unauthorizedMissing or invalid X-Louie-API-Key or X-Api-Token header (whichever your endpoint requires).
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_reachedlak_ key's daily 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, 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

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"
    }
  ]
}

Inventory

GET /api/v1/inventory 🔑 Auth required

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

GET /api/v1/sales-summary 🔑 Auth required

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

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

Routes a deal profile against the same real 53-lender matrix used inside the app.

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 required stips for a given lender/FICO/profile combination.

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

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

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

Returns the same aged-inventory morning briefing shown inside the app.

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

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.