Every REF is a callable style. Point any AI at the endpoint. Get a number and the fixes. One call, deterministic.
Any tool that generates something visual can call this to check the output against a style and get back a number and the fixes. This is how you keep AI output on-brand.
curl -X POST https://ref.rizzgroup.org/api/public/score \
-H "Authorization: Bearer ref_live_..." \
-H "Content-Type: application/json" \
-d '{
"image_url": "https://your.host/screenshot.png",
"ref": "loud-print",
"threshold": 85
}'const res = await fetch("https://ref.rizzgroup.org/api/public/score", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.REF_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
image_url: "https://your.host/screenshot.png",
ref: "loud-print",
threshold: 85,
}),
});
const { on_ref_score, pass, calls } = await res.json();The shape below is exact. The numbers are not: they are placeholders showing what a response looks like, and no image produced them.
{
"ref": "loud-print",
"on_ref_score": 82,
"pass": false,
"threshold": 85,
"weakest": "contrast",
"dimensions": {
"palette": 91, "whitespace": 88,
"contrast": 62, "flatness": 100
},
"calls": [
{
"dimension": "contrast",
"lead": "Contrast is off the ref.",
"detail": "Your image sits in a narrow value band. Push brights brighter and darks darker."
}
],
"verdict": "Close. Contrast is the weak axis.",
"measured": {
"palette": [{"hex":"#E04A47","usage":0.31}, ...],
"whitespaceRatio": 0.14,
"gradientLikelihood": 0.22
}
}Free tier: 100 scores per rolling 24 hours per key owner. Above that returns 429 with resets_in_hours. Requests over 8MB or non-image content types are rejected before scoring.