curl --request POST \
--url https://www.presolve.com/api/v1/cases \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"dateOfBirth": "<string>",
"zipCode": "<string>",
"city": "<string>",
"state": "<string>",
"description": "<string>",
"caseType": "<string>",
"subCaseType": "<string>",
"attorneyId": "<string>",
"matterStage": "<string>",
"matterStatus": "<string>",
"estimatedSettlementMin": 123,
"estimatedSettlementMax": 123,
"estimatedTimeToResolution": 123,
"dateOfIncident": "<string>",
"partnerId": "<string>",
"partnerName": "<string>",
"isCommercial": true,
"highValue": true,
"surveyDetails": {},
"targetOrganizationId": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: '<string>',
lastName: '<string>',
email: '<string>',
phone: '<string>',
dateOfBirth: '<string>',
zipCode: '<string>',
city: '<string>',
state: '<string>',
description: '<string>',
caseType: '<string>',
subCaseType: '<string>',
attorneyId: '<string>',
matterStage: '<string>',
matterStatus: '<string>',
estimatedSettlementMin: 123,
estimatedSettlementMax: 123,
estimatedTimeToResolution: 123,
dateOfIncident: '<string>',
partnerId: '<string>',
partnerName: '<string>',
isCommercial: true,
highValue: true,
surveyDetails: {},
targetOrganizationId: '<string>'
})
};
fetch('https://www.presolve.com/api/v1/cases', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://www.presolve.com/api/v1/cases"
payload = {
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"dateOfBirth": "<string>",
"zipCode": "<string>",
"city": "<string>",
"state": "<string>",
"description": "<string>",
"caseType": "<string>",
"subCaseType": "<string>",
"attorneyId": "<string>",
"matterStage": "<string>",
"matterStatus": "<string>",
"estimatedSettlementMin": 123,
"estimatedSettlementMax": 123,
"estimatedTimeToResolution": 123,
"dateOfIncident": "<string>",
"partnerId": "<string>",
"partnerName": "<string>",
"isCommercial": True,
"highValue": True,
"surveyDetails": {},
"targetOrganizationId": "<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 case
Creates a case (plus plaintiff and intake survey details) in the caller’s organization through the canonical write-once ownership command. Partner keys and OIDC bearers keep working unchanged; integration keys require cases:write and the standard X-Idempotency-Key contract.
Supports one selected organization via organizationId. Omit it to use the key’s organization. HQ descendant access requires an active acting attorney with hq:view_child_orgs, cases:view, cases:view_all, hq:view_all_cases, hq:manage_child_orgs, cases:create, cases:assign, intake:create. Existing key scopes still apply. The selector requires an integration API key; legacy partner/OIDC routing is unchanged. Repeat the selector on every cursor page, related mutation, upload completion, and detail/download request. Mutation key scopes, idempotency, revisions, and resource-specific eligibility still apply. See HQ authorization.
Requires the cases:write scope. Legacy partner API keys and OIDC bearer tokens are also accepted on this endpoint (shipped behavior, unchanged); integration keys are scope-enforced. Mutations require an X-Idempotency-Key header (responses are stored for replay; reusing a key with a different request returns 409 IDEMPOTENCY_CONFLICT). Rate tier: write.
curl --request POST \
--url https://www.presolve.com/api/v1/cases \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"dateOfBirth": "<string>",
"zipCode": "<string>",
"city": "<string>",
"state": "<string>",
"description": "<string>",
"caseType": "<string>",
"subCaseType": "<string>",
"attorneyId": "<string>",
"matterStage": "<string>",
"matterStatus": "<string>",
"estimatedSettlementMin": 123,
"estimatedSettlementMax": 123,
"estimatedTimeToResolution": 123,
"dateOfIncident": "<string>",
"partnerId": "<string>",
"partnerName": "<string>",
"isCommercial": true,
"highValue": true,
"surveyDetails": {},
"targetOrganizationId": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: '<string>',
lastName: '<string>',
email: '<string>',
phone: '<string>',
dateOfBirth: '<string>',
zipCode: '<string>',
city: '<string>',
state: '<string>',
description: '<string>',
caseType: '<string>',
subCaseType: '<string>',
attorneyId: '<string>',
matterStage: '<string>',
matterStatus: '<string>',
estimatedSettlementMin: 123,
estimatedSettlementMax: 123,
estimatedTimeToResolution: 123,
dateOfIncident: '<string>',
partnerId: '<string>',
partnerName: '<string>',
isCommercial: true,
highValue: true,
surveyDetails: {},
targetOrganizationId: '<string>'
})
};
fetch('https://www.presolve.com/api/v1/cases', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://www.presolve.com/api/v1/cases"
payload = {
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"dateOfBirth": "<string>",
"zipCode": "<string>",
"city": "<string>",
"state": "<string>",
"description": "<string>",
"caseType": "<string>",
"subCaseType": "<string>",
"attorneyId": "<string>",
"matterStage": "<string>",
"matterStatus": "<string>",
"estimatedSettlementMin": 123,
"estimatedSettlementMax": 123,
"estimatedTimeToResolution": 123,
"dateOfIncident": "<string>",
"partnerId": "<string>",
"partnerName": "<string>",
"isCommercial": True,
"highValue": True,
"surveyDetails": {},
"targetOrganizationId": "<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.
Headers
Required for integration-key callers; optional for legacy partner-key/OIDC callers.
200Query Parameters
Select one organization for this request. Defaults to the key organization. An HQ key may select an active descendant when its active acting attorney has the required HQ and resource permissions. Repeat the same organizationId on related mutations, upload completion, detail requests, and every cursor page. See /authorization.
Body
attorney, plaintiff Dollars (converted to cents server-side)
Dollars (converted to cents server-side)
Intake survey answers keyed by accessor (max 200 keys)
Show child attributes
Show child attributes
Partner keys with partner_multi_org only