Public appetite check (no key)
curl -X POST "https://api.valjeanspecialty.com/api/appetite" \ -H "Content-Type: application/json" \ -d '{"lines":["General Liability"],"state":"South Carolina","description":"restaurant with a bar"}'const res = await fetch("https://api.valjeanspecialty.com/api/appetite", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ "lines": [ "General Liability" ], "state": "South Carolina", "description": "restaurant with a bar" }),});console.log(await res.json());import os, requests
res = requests.post( "https://api.valjeanspecialty.com/api/appetite", json={ "lines": [ "General Liability" ], "state": "South Carolina", "description": "restaurant with a bar" },)print(res.json())The same appetite answer without a key, for websites. Rate-limited to 30 requests a minute per IP; answers cache at the edge for 5 minutes. GET with the same fields as query parameters (lines comma-separated) also works.
No key needed.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Example
{ "lines": [ "General Liability" ], "state": "South Carolina", "description": "restaurant with a bar"}Responses
Section titled “Responses”OK
object
“unknown” means no appetite is on file for these lines yet: fall back to your own guidance.
One sentence you can show as is.
Markets on file that could write it, capped at 5. Market names are never returned.
E.g. “2 markets”, “5+ markets”, “Not on file yet”.
object
Line code.
What Valjean will need for this risk, in plain words.
The class Valjean matched the risk to, if any.
Two-letter state code.
Lines in the request Valjean didn’t recognise.
Present whenever the fit isn’t “good”: a broker reviews every submission, including ones outside the appetite on file.
object
Where to email the risk instead.
What to include in that email.
Example
{ "fit": "good", "lines": [ { "fit": "good" } ]}Fix the request and send it again (invalid_request, invalid_json).
object
object
Machine-readable code, e.g. invalid_request, read_only, not_found, closed, rate_limited.
Plain-English explanation you can show a person.
Validation problems, as “field: problem” (400 invalid_request only).
Example
{ "error": { "code": "invalid_request", "message": "Check the request.", "issues": [ "insured.state: Too small: expected string to have >=2 characters" ] }}Body or file too large (too_large): JSON bodies up to 64 KB, direct uploads 4 MB, upload links 25 MB.
object
object
Machine-readable code, e.g. invalid_request, read_only, not_found, closed, rate_limited.
Plain-English explanation you can show a person.
Validation problems, as “field: problem” (400 invalid_request only).
Example
{ "error": { "code": "too_large", "message": "Files over 4 MB need an upload link." }}Too many requests (rate_limited): 120 a minute per key, 30 a minute per IP on public endpoints, counted across all of Valjean’s servers. Wait Retry-After seconds.
object
object
Machine-readable code, e.g. invalid_request, read_only, not_found, closed, rate_limited.
Plain-English explanation you can show a person.
Validation problems, as “field: problem” (400 invalid_request only).
Example
{ "error": { "code": "rate_limited", "message": "Too many requests. Try again in a minute." }}Headers
Section titled “Headers”Example
60Seconds to wait.

