Responses and errors
Every response is JSON.
201 Created
Section titled “201 Created”The draft was created.
{ "quoteId": "b1e7c2d4-…", "status": "pending_review", "clientRef": "b21e47d0-…", "reviewLink": { "sent": true, "expiresInHours": 72, "sms": { "sent": true, "expiresInHours": 72 }, "email": { "sent": true, "expiresInHours": 72 } }, "warnings": [], "missingCriticalFields": []}| Field | Meaning |
|---|---|
quoteId |
Credify’s id for the application. |
status |
pending_review until the customer confirms. |
clientRef |
This application’s reference in your reporting. Absent only when warnings contains attribution_failed; retrying the same call.id repairs it. |
reviewLink.sent |
true when either channel delivered the link. |
reviewLink.sms / reviewLink.email |
Per-channel results. A channel that didn’t send carries a reason. |
reviewLink.reason |
Set only when nothing was sent at all. |
missingCriticalFields |
Any of first_name, last_name, email, phone, postal_code, product you didn’t send. |
warnings |
Non-fatal notes. See below. |
Review link reasons
Section titled “Review link reasons”reason |
Channel | Meaning |
|---|---|---|
test_mode |
both | The request used a test key, which never contacts the customer. |
no_sms_consent |
sms | consent.sms_review_link was not true. |
no_phone |
sms | No usable 10-digit phone. |
no_email |
No email address. | |
already_sent |
either | That channel was already used for this application. |
send_failed |
either | The message provider rejected it. The draft is unaffected; use the resend action. |
already_processed |
both | An idempotent retry. Nothing was sent again. |
Warnings
Section titled “Warnings”| Warning | Meaning |
|---|---|
unsupported_state:<state> |
The address is outside TX and NJ. |
invalid_phone_dropped |
The phone was not 10 digits. |
invalid_ssn_dropped / invalid_ssn_dropped:driver |
An SSN was not 9 digits. |
invalid_date_dropped:<field> |
A date could not be read. |
invalid_boolean_dropped:<field> / invalid_number_dropped:<field> |
A yes/no or numeric field could not be read. |
incomplete_violation_dropped / incomplete_accident_dropped / incomplete_loss_dropped |
A driver history entry was missing a required field and was dropped. |
vehicles_overflow:<sent>_of_<reported> / drivers_overflow:… |
vehicle_count or driver_count is higher than the entries you sent. |
unrated_without_prerequisite:<field> |
A detail field was sent without the companion value it depends on, so it won’t be rated. |
persist_failed |
Some fields could not be saved. The draft exists; the customer completes them on review. |
attribution_failed |
The draft exists but could not be credited yet. Retry with the same call.id. |
200 OK
Section titled “200 OK”A retry of a call.id you already sent.
{ "quoteId": "b1e7c2d4-…", "status": "pending_review", "idempotent": true, "clientRef": "b21e47d0-…", "reviewLink": { "sent": false, "reason": "already_processed", "sms": { "sent": false, "reason": "already_processed" }, "email": { "sent": false, "reason": "already_processed" } }, "warnings": [], "missingCriticalFields": []}Errors
Section titled “Errors”Errors have the shape { "error": "<message>" }.
| Status | When | Retry? |
|---|---|---|
400 |
The body is not valid JSON: Request body must be valid JSON. |
Fix the body. |
401 |
Missing, unknown, revoked or expired key. See authentication errors. | Fix the key. |
403 |
The key may not submit applications, or the account is not active. | Fix the key. |
422 |
The body failed validation, or is larger than 256 KB. | Fix the body. |
429 |
Rate limited. Wait for the Retry-After header. |
Yes, same call.id. |
500 |
Unexpected error: Failed to process AI intake request. |
Yes, same call.id. |
A validation 422 lists each problem:
{ "error": "Invalid intake payload", "fields": [{ "field": "call.id", "message": "'call.id' is required (idempotency key)" }]}Validation covers call.id (required, at most 200 characters) and product
(Home, Auto or Bundle). Everything else is lenient: see
It’s a draft.
Resend the review link
Section titled “Resend the review link”When a link has expired or you now have a phone number, send a fresh link without creating a new draft:
{ "action": "resend_review_link", "callId": "crm-application-10481" }Send callId (the call.id you submitted) or quoteId. The link is sent on
every channel the application has a contact for.
| Status | Meaning |
|---|---|
200 |
Sent: { "quoteId": "…", "reviewLink": { … } }. With a test key, reviewLink.reason is test_mode and nothing is sent. |
400 |
Neither callId nor quoteId was given. |
404 |
No application of yours matches. |
409 |
The customer has already confirmed the application. |
422 |
Nothing could be sent: no phone or email on file, or every send failed. reviewLink says why. |