Answer what's needed, once for every market (POST form)
curl -X POST "https://api.valjeanspecialty.com/api/agent/v1/submissions/SUBMISSION_ID/answers" \ -H "Authorization: Bearer $VALJEAN_KEY" \ -H "Content-Type: application/json" \ -d '{"answers":[{"key":"hours","value":"11am to midnight, 7 days"}],"message":"Seats 120. Payroll is $640K and they've been open 12 years."}'const res = await fetch("https://api.valjeanspecialty.com/api/agent/v1/submissions/SUBMISSION_ID/answers", { method: "POST", headers: { Authorization: `Bearer ${process.env.VALJEAN_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ "answers": [ { "key": "hours", "value": "11am to midnight, 7 days" } ], "message": "Seats 120. Payroll is $640K and they've been open 12 years." }),});console.log(await res.json());import os, requests
res = requests.post( "https://api.valjeanspecialty.com/api/agent/v1/submissions/SUBMISSION_ID/answers", headers={"Authorization": f"Bearer {os.environ['VALJEAN_KEY']}"}, json={ "answers": [ { "key": "hours", "value": "11am to midnight, 7 days" } ], "message": "Seats 120. Payroll is $640K and they've been open 12 years." },)print(res.json())Same as PATCH /submissions/{id}/answers; kept for clients that can’t send PATCH.
Answers open items by key; one answer fills every market that asks the same thing. fields only fill blanks: anything Valjean already has is kept. Answers that don’t fit the item’s answer type come back in rejected and aren’t saved. Or send message: the answers in plain sentences, and Valjean maps them to the open items (from_message shows what it understood; anything sent by key wins). A broker confirms everything. POST to the same path works too.
Needs a read-and-submit key and an agency with a signed broker agreement.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Submission id.
Request Bodyrequired
Section titled “Request Bodyrequired”object
object
object
Example
{ "answers": [ { "key": "hours", "value": "11am to midnight, 7 days" } ], "message": "Seats 120. Payroll is $640K and they've been open 12 years."}Responses
Section titled “Responses”OK
object
Keys that were recorded.
Keys not asked on this file (still saved in the file note).
Answers that didn’t fit the expected type: not saved.
object
Keys that need a document upload rather than text.
Fields that were blank and are now filled.
Fields Valjean already had: kept, not overwritten.
Only when message was sent: what Valjean understood from it.
object
Answers read from message (keys you also sent directly are left to yours).
object
Fields read from message.
Sentences or values that couldn’t be mapped. Send them by key, or reword.
What’s still open after these answers.
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.
Example
{ "answered": [ "hours", "capacity" ], "unmatched": [], "rejected": [], "upload_instead": [], "fields_filled": [ "annual_payroll", "years_in_business" ], "fields_kept": [], "from_message": { "answers": [ { "key": "capacity", "value": "120" } ], "fields": [ "annual_payroll", "years_in_business" ], "not_understood": [] }, "note": "Answers go to your broker to confirm. Anything already on file was kept.", "needs": []}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." }}Not found, or not your agency’s (not_found). The API never says which.
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": "not_found", "message": "Submission not found." }}The file’s state doesn’t allow it: closed, not_open, quote_expired, already_requested, not_withdrawable (the bind request already went to the market: call your broker), no_instant_market, limit, or ai_off (plain-sentence answers aren’t switched on; send answers by key). Don’t retry the same request.
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": "closed", "message": "This submission is closed." }}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." }}A service Valjean relies on didn’t answer (ai_unavailable: the message couldn’t be read just now). Retry shortly, or send answers by key.
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": "ai_unavailable", "message": "Couldn't read the message just now. Try again, or send answers by key." }}
