LuxePlatforms
Rather just talk?(816) 477-6802hello@luxeplatforms.comKansas City · Building nationwide
(Developer API)

The grader, as an API.

Real website audits over one REST call: performance and Core Web Vitals, SEO, AI visibility, accessibility, and security, from real Google Lighthouse and axe-core data. Async jobs, webhook delivery, per-key quotas. Free tier, no card.

Quickstart

One call, real data back.

Start an audit with your key. You get a job id back instantly, then poll it or let us POST the result to your webhook when it's done.

cURL

curl -X POST https://grader-api.luxeplatforms.com/v1/audit \
  -H "Authorization: Bearer lxg_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'

# → { "status": "queued", "id": "42", "poll": "/v1/audit/42" }

JavaScript

const res = await fetch("https://grader-api.luxeplatforms.com/v1/audit", {
  method: "POST",
  headers: {
    Authorization: "Bearer lxg_live_your_key",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ url: "https://example.com" }),
});
const { id } = await res.json();

Python

import requests

r = requests.post(
    "https://grader-api.luxeplatforms.com/v1/audit",
    headers={"Authorization": "Bearer lxg_live_your_key"},
    json={"url": "https://example.com"},
)
job_id = r.json()["id"]

Base URL: https://grader-api.luxeplatforms.com · Auth: Authorization: Bearer <key> (server-side only, never ship a key to the browser)

Plans

Priced on throughput, not nickel-and-dimed.

PlanPriceAuditsRateNotes
Free$025 / mo5 / minTest & buildGet a key →
Starter$9 / mo250 / mo10 / min$0.05 / audit overSubscribe →
Pro$39 / mo2,000 / mo20 / min$0.03 / audit overSubscribe →
Agency$199 / mo15,000 / mo60 / minWhite-label · $0.02 overSubscribe →
EnterpriseCustomCustomDedicatedSLA · own capacityContact →

The public grader UI stays free for humans. These limits are for programmatic API access. Overage steps down as you scale, so heavier use gets cheaper per audit.

Endpoints

POST /v1/audit

Start an audit. Returns a job id immediately (or a cached result if the same URL was graded in the last 30 minutes). Pass an optional webhookURL and we'll POST the finished report to it.

POST /v1/audit
{
  "url": "https://example.com",
  "webhook": "https://you.com/hooks/grader"   // optional
}

// 200
{ "status": "queued", "id": "42", "poll": "/v1/audit/42", "position": 0 }
// or, on a cache hit:
{ "status": "completed", "cached": true, "result": { ... } }

GET /v1/audit/:id

Poll a job. Returns queued, active, then completed with the full report (grade, per-category scores, findings, screenshots, crawl, and a shareable report id).

GET /v1/audit/42

{ "status": "completed", "result": {
    "url": "https://example.com/",
    "grade": "B", "overall": 88, "issueCount": 6,
    "categories": [ { "id": "performance", "score": 79, "findings": [ ... ] }, ... ],
    "shareId": "1c48a2784742"
} }

GET /v1/usage

Your key's current tier, monthly usage, and limits.

GET /v1/usage

{ "tier": "free", "monthlyLimit": 25, "used": 3,
  "remaining": 22, "perMinuteLimit": 5, "resets": "2026-07 (UTC month)" }
Webhooks

Skip the polling.

Register a webhookon the audit request and we'll POST the completed report straight to you the moment it's done. Same payload as a finished poll.

POST https://you.com/hooks/grader
{
  "event": "audit.completed",
  "result": { "url": "...", "grade": "B", "overall": 88, "categories": [ ... ], "shareId": "..." }
}

Every delivery is signed. Verify the X-Grader-Signature header (t=timestamp,v1=hmac) against your webhook signing secret from the dashboard so you know the call is really from us:

import crypto from "crypto";

const sig = req.headers["x-grader-signature"];        // "t=...,v1=..."
const { t, v1 } = Object.fromEntries(sig.split(",").map((p) => p.split("=")));
const expected = crypto
  .createHmac("sha256", WEBHOOK_SIGNING_SECRET)
  .update(t + "." + rawBody)
  .digest("hex");
const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
Errors
400
missing_url / invalid_url
The body has no valid 'url'.
401
invalid_api_key
Missing or unrecognized API key.
402
quota_exceeded
Monthly audit quota reached. Upgrade for more.
429
rate_limited
Too many requests this minute. Slow down.
404
not_found
That job id doesn't exist.
Early access

Want a key?

The API is live. We're handing out keys to early developers now. Tell us what you're building and we'll get you set up.

Request an API key

Already subscribed? Sign in to your dashboard