curl --request POST \
--url https://www.presolve.com/api/v1/leads \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"description": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"zipCode": "<string>",
"city": "<string>",
"state": "<string>",
"caseType": "<string>",
"surveyDetails": {},
"lemonLaw": {
"make": "<string>",
"model": "<string>",
"year": 2000,
"vin": "<string>",
"purchaseDate": "<string>",
"acquisitionMonth": "<string>",
"dealerName": "<string>",
"lienholderName": "<string>",
"repairAttempts": 1073741823,
"issues": "<string>",
"firstRepairDate": "<string>",
"firstRepairMileage": 1073741823,
"daysOutOfService": 1073741823,
"currentMileage": 1073741823,
"purchaseMileage": 1073741823,
"soldOrTradedNotes": "<string>"
}
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: '<string>',
firstName: '<string>',
lastName: '<string>',
email: '<string>',
phone: '<string>',
zipCode: '<string>',
city: '<string>',
state: '<string>',
caseType: '<string>',
surveyDetails: {},
lemonLaw: {
make: '<string>',
model: '<string>',
year: 2000,
vin: '<string>',
purchaseDate: '<string>',
acquisitionMonth: '<string>',
dealerName: '<string>',
lienholderName: '<string>',
repairAttempts: 1073741823,
issues: '<string>',
firstRepairDate: '<string>',
firstRepairMileage: 1073741823,
daysOutOfService: 1073741823,
currentMileage: 1073741823,
purchaseMileage: 1073741823,
soldOrTradedNotes: '<string>'
}
})
};
fetch('https://www.presolve.com/api/v1/leads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://www.presolve.com/api/v1/leads"
payload = {
"description": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"zipCode": "<string>",
"city": "<string>",
"state": "<string>",
"caseType": "<string>",
"surveyDetails": {},
"lemonLaw": {
"make": "<string>",
"model": "<string>",
"year": 2000,
"vin": "<string>",
"purchaseDate": "<string>",
"acquisitionMonth": "<string>",
"dealerName": "<string>",
"lienholderName": "<string>",
"repairAttempts": 1073741823,
"issues": "<string>",
"firstRepairDate": "<string>",
"firstRepairMileage": 1073741823,
"daysOutOfService": 1073741823,
"currentMileage": 1073741823,
"purchaseMileage": 1073741823,
"soldOrTradedNotes": "<string>"
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}Create a lead
Creates a lead + case + plaintiff + initial survey details, pinned to the validated receiving organization (no marketplace routing). leadStatus accepts new_lead (the default) and test_lead; the retired spelling PendingLead is accepted and stored as new_lead. screened_needs_match returns HTTP 400 before creating a lead because marketplace placement is unsupported. Ordinary leads immediately appear in the receiving firm’s Pending Leads and New Leads lists, even without an individual attorney; test leads remain hidden. Legacy partner keys keep working; integration keys require leads:write.
Requires the leads:write scope. Legacy partner API keys and OIDC bearer tokens are also accepted on this endpoint (shipped behavior, unchanged); integration keys are scope-enforced. Rate tier: write.
curl --request POST \
--url https://www.presolve.com/api/v1/leads \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"description": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"zipCode": "<string>",
"city": "<string>",
"state": "<string>",
"caseType": "<string>",
"surveyDetails": {},
"lemonLaw": {
"make": "<string>",
"model": "<string>",
"year": 2000,
"vin": "<string>",
"purchaseDate": "<string>",
"acquisitionMonth": "<string>",
"dealerName": "<string>",
"lienholderName": "<string>",
"repairAttempts": 1073741823,
"issues": "<string>",
"firstRepairDate": "<string>",
"firstRepairMileage": 1073741823,
"daysOutOfService": 1073741823,
"currentMileage": 1073741823,
"purchaseMileage": 1073741823,
"soldOrTradedNotes": "<string>"
}
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: '<string>',
firstName: '<string>',
lastName: '<string>',
email: '<string>',
phone: '<string>',
zipCode: '<string>',
city: '<string>',
state: '<string>',
caseType: '<string>',
surveyDetails: {},
lemonLaw: {
make: '<string>',
model: '<string>',
year: 2000,
vin: '<string>',
purchaseDate: '<string>',
acquisitionMonth: '<string>',
dealerName: '<string>',
lienholderName: '<string>',
repairAttempts: 1073741823,
issues: '<string>',
firstRepairDate: '<string>',
firstRepairMileage: 1073741823,
daysOutOfService: 1073741823,
currentMileage: 1073741823,
purchaseMileage: 1073741823,
soldOrTradedNotes: '<string>'
}
})
};
fetch('https://www.presolve.com/api/v1/leads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://www.presolve.com/api/v1/leads"
payload = {
"description": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"zipCode": "<string>",
"city": "<string>",
"state": "<string>",
"caseType": "<string>",
"surveyDetails": {},
"lemonLaw": {
"make": "<string>",
"model": "<string>",
"year": 2000,
"vin": "<string>",
"purchaseDate": "<string>",
"acquisitionMonth": "<string>",
"dealerName": "<string>",
"lienholderName": "<string>",
"repairAttempts": 1073741823,
"issues": "<string>",
"firstRepairDate": "<string>",
"firstRepairMileage": 1073741823,
"daysOutOfService": 1073741823,
"currentMileage": 1073741823,
"purchaseMileage": 1073741823,
"soldOrTradedNotes": "<string>"
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}Authorizations
Org-issued integration API key (service account credential). The plaintext secret is shown once at creation.
Body
Other legacy lead properties retain their existing imperative validation; see docs/api/v1-public-api.md.
Required narrative, including when lemonLaw is supplied.
Intake answers keyed by accessor (max 200 keys). Null-valued entries are skipped. Do not duplicate an accessor supplied through lemonLaw, even with the same value.
Show child attributes
Show child attributes
Optional structured Lemon Law intake. Requires effective caseType "Lemon Law"; PATCH may inherit the stored case type. Supplied fields overwrite canonical survey answers and take precedence over client-derived values. Omitted fields are preserved. Nulls, blanks, unknown fields, and overlapping surveyDetails accessors return HTTP 400. Use surveyDetails for intentional blanks.
Show child attributes
Show child attributes