Send a submission
curl -X POST "https://api.valjeanspecialty.com/api/agent/v1/submissions" \ -H "Authorization: Bearer $VALJEAN_KEY" \ -H "Content-Type: application/json" \ -d '{"client_reference":"AMS-10442","insured":{"name":"Shem Creek Oyster Bar LLC","state":"SC","city":"Mount Pleasant"},"lines":["GL","LL"],"effective_date":"2026-12-15","class_description":"Bar and restaurant","operations":"Seafood restaurant with a full bar, closes at midnight","annual_revenue":2100000}'const res = await fetch("https://api.valjeanspecialty.com/api/agent/v1/submissions", { method: "POST", headers: { Authorization: `Bearer ${process.env.VALJEAN_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ "client_reference": "AMS-10442", "insured": { "name": "Shem Creek Oyster Bar LLC", "state": "SC", "city": "Mount Pleasant" }, "lines": [ "GL", "LL" ], "effective_date": "2026-12-15", "class_description": "Bar and restaurant", "operations": "Seafood restaurant with a full bar, closes at midnight", "annual_revenue": 2100000 }),});console.log(await res.json());import os, requests
res = requests.post( "https://api.valjeanspecialty.com/api/agent/v1/submissions", headers={"Authorization": f"Bearer {os.environ['VALJEAN_KEY']}"}, json={ "client_reference": "AMS-10442", "insured": { "name": "Shem Creek Oyster Bar LLC", "state": "SC", "city": "Mount Pleasant" }, "lines": [ "GL", "LL" ], "effective_date": "2026-12-15", "class_description": "Bar and restaurant", "operations": "Seafood restaurant with a full bar, closes at midnight", "annual_revenue": 2100000 },)print(res.json())Creates a file from structured facts. Always send client_reference or an Idempotency-Key header: a retry with the same value returns the same file (200, duplicate: true) instead of creating another. The response lists what’s still needed.
Needs a read-and-submit key and an agency with a signed broker agreement.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Your own id for this request (up to 80 letters, numbers, . _ : -). Used as client_reference when the body has none; a retry with the same key returns the first file (200, duplicate: true). If both are sent they must match.
Example
AMS-10442Query Parameters
Section titled “Query Parameters”1 to check the request and see what would happen, without saving or sending anything.
Request Bodyrequired
Section titled “Request Bodyrequired”object
object
Example
{ "client_reference": "AMS-10442", "insured": { "name": "Shem Creek Oyster Bar LLC", "state": "SC", "city": "Mount Pleasant" }, "lines": [ "GL", "LL" ], "effective_date": "2026-12-15", "class_description": "Bar and restaurant", "operations": "Seafood restaurant with a full bar, closes at midnight", "annual_revenue": 2100000}Responses
Section titled “Responses”With ?dry_run=1: every check passed and nothing was saved or sent.
With ?dry_run=1: checked, nothing saved or sent. Other fields describe what would happen (the file’s insured and lines, an existing file’s id, or the quote and its subjectivities).
object
The request passed every check. A request that fails a check returns the same error it would without dry_run.
What sending it for real would do.
Example
{ "dry_run": true, "valid": true, "would": "create"}Headers
Section titled “Headers”Example
"per-key";q=120;w=60The rate limit for this key, as an IETF RateLimit-Policy: 120 requests (q) per 60-second window (w), counted across all of Valjean’s servers. Over it, you get 429 with Retry-After.
OK
object
Valjean reference, e.g. VS-000624.
Line names, e.g. “General Liability”.
Plain-English status you can show as is.
File names on the submission.
What’s still open, each with a key. Empty once the file is closed.
object
Document, field, question, photo, or “requested” (an item your broker asked for).
“answer”, “upload a document” or “answer or upload”.
object
How to answer. “file” means upload a document instead.
For type “choice”: the allowed answers.
Quotes your broker has presented.
Anonymous counts: market names appear only on presented quotes.
object
Markets the file has been sent to.
Quotes your broker has presented to you.
One plain sentence, e.g. “With 4 markets: 3 quoted, 1 declined.”
True when client_reference (or the Idempotency-Key header) matched an existing file: that file is returned with 200 and nothing new is created.
A private status page you can share with the producer. Treat it like a password. Returned when the file is created; a duplicate doesn’t make another link.
Example
{ "id": "6f2a1c9e-4b3d-4e8a-9c21-7d4e5f6a8b90", "reference": "VS-000624", "insured": "Shem Creek Oyster Bar LLC", "lines": [ "General Liability", "Liquor Liability" ], "effective_date": "2026-12-15", "status": "Waiting on information from you", "stage": "needs_info", "received_at": "2026-11-02T14:15:11Z", "updated_at": "2026-11-02T14:16:02Z", "files": [ "ACORD 125.pdf" ], "needs": [ { "key": "hours", "label": "Hours of operation and closing time", "type": "question", "level": "required", "how": "answer", "answer": { "type": "text" } }, { "key": "capacity", "label": "Seating / occupancy capacity", "type": "question", "level": "recommended", "how": "answer", "answer": { "type": "number" } }, { "key": "loss_runs", "label": "Currently valued loss runs – 5 years", "type": "document", "level": "required", "how": "upload a document", "answer": { "type": "file" } } ], "quotes_ready": 0, "markets": { "reviewing": 0, "declined": 0, "quoted": 0, "no_response": 0, "total": 0, "presented": 0, "text": "Not sent to markets yet." }, "broker": { "name": "[Broker name]", "email": "broker@valjeanspecialty.com" }, "duplicate": false, "status_url": "https://valjops.vercel.app/s/EXAMPLE-status-link"}Headers
Section titled “Headers”Example
"per-key";q=120;w=60The rate limit for this key, as an IETF RateLimit-Policy: 120 requests (q) per 60-second window (w), counted across all of Valjean’s servers. Over it, you get 429 with Retry-After.
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" ] }}Key or token missing, wrong, expired or revoked (unauthorized). Don’t retry: get a new key or sign in again.
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": "unauthorized", "message": "This API key isn't valid. Ask your Valjean broker for a new one." }}Not allowed: read_only (a read key tried to submit), agency_not_active (no signed broker agreement), not_offered (instant quotes are off), forbidden (API access off for the agency). Don’t retry.
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": "read_only", "message": "This key can read only. Ask your Valjean broker for a key that can submit." }}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.
Something went wrong on Valjean’s side (server_error). Safe to retry later; creates are idempotent with client_reference or an Idempotency-Key header.
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": "server_error", "message": "Something went wrong. Try again shortly." }}
