---
title: "Promote Smartadvocate Intake Draft"
method: POST
path: "/smartadvocate/intake-draft/{smartadvocate_intake_draft_id}/promote"
tags: ["SmartAdvocate"]
---

# Promote Smartadvocate Intake Draft

`POST /smartadvocate/intake-draft/{smartadvocate_intake_draft_id}/promote`

## Request

- Base URL: `https://api.openintake.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.openintake.ai/smartadvocate/intake-draft/{smartadvocate_intake_draft_id}/promote`
- Auth: none declared

Promote a draft intake: create the contact and case in SmartAdvocate.

Runs the shared sixteen-step promoter — the same one the Celery auto-push
path uses — with the (user-edited) fields from the request. Dedup is
re-checked at promote time since the draft's snapshot may be stale:

- If the caller's phone matches an existing synced SA contact, only the
  case is created, attached via PlaintiffContactID.
- If the matched contact already has a case with the same incident date,
  the promote is refused (409) unless override_duplicates is set.
- If staff opened a case for this caller shortly before or after the call
  (read live from SA), the intake merges into it: nothing the firm entered
  is overwritten and our facts are appended. merge_into_case_id or
  force_new_case overrides that choice; an undecidable match is 409.

Only contact and case creation are fatal. Every enrichment step (plaintiff
role, injuries, insurance, providers, vehicle, tags, status, intake fields, call
log) records its own outcome in the response's promote_steps, so a case is
never lost to one rejected id — the failed steps can be re-run via
retry-steps.

## Path parameters

- `smartadvocate_intake_draft_id` string, uuid, required

## Request body

- SmartAdvocateIntakeDraftPromoteRequest: Promote a draft intake: create the contact (unless matched) and case in SmartAdvocate. Fields carry the user's edits from the promote dialog. Case group/type IDs fall back to the customer's configured intake defaults when omitted.
  - `first_name` string, required
  - `last_name` string, required
  - `email` string, nullable
  - `phone_number` string, nullable
  - `date_of_birth` string, date, nullable
  - `gender` string, nullable
  - `address_line1` string, nullable
  - `city` string, nullable
  - `state` string, nullable
  - `zip_code` string, nullable
  - `case_summary` string, nullable
  - `incident_date` string, date, nullable
  - `case_group_id` integer, nullable
  - `case_type_id` integer, nullable
  - `enrichment` object, nullable: The (possibly user-edited) rich extraction to promote. Omit to use the draft's stored enrichment; send {} to promote without any enrichment
  - `override_duplicates` boolean: Create the case even when an existing case with the same incident date was found for the matched contact
  - `merge_into_case_id` integer, nullable: Merge into this recently opened SA case (one of the preview's existing_case_candidates) instead of creating one
  - `force_new_case` boolean: Create a new case even when a recently opened case for the caller was found
  - `expect_new_case` boolean: The preview showed no case to merge into; refuse (409) rather than merge if staff have opened one since
  - `confirm_identity` boolean: Staff confirmed who the plaintiff is; push even though the preview's identity_review_reason was set

## Response `200`

Successful Response

- SmartAdvocateIntakeDraftResponse: LLM-drafted SmartAdvocate intake (contact + case) derived from a call transcript.
  - `smartadvocate_intake_draft_id` string, uuid, required
  - `call_id` string, uuid, required
  - `first_name` string, nullable
  - `last_name` string, nullable
  - `email` string, nullable
  - `phone_number` string, nullable
  - `date_of_birth` string, date, nullable
  - `gender` string, nullable
  - `address_line1` string, nullable
  - `city` string, nullable
  - `state` string, nullable
  - `zip_code` string, nullable
  - `case_summary` string, nullable
  - `incident_date` string, date, nullable
  - `incident_state` string, nullable
  - `case_type_hint` string, nullable
  - `matched_sa_contact_id` integer, nullable: Existing SA contact matched by the caller's phone number; promotion attaches the case to it instead of creating a new contact
  - `matched_sa_contact_name` string, nullable
  - `ambiguous_contact_match` boolean: Multiple person contacts share the caller's phone number; the match shown is a best guess and needs manual review
  - `duplicate_case_numbers` string[]: Existing case numbers on the matched contact with the same incident date (likely repeat caller about the same accident)
  - `existing_case_candidates` object[]: Cases staff opened recently for a caller like this one, found live in SA at promote time [{sa_case_id, case_number, case_name, created_date, phone_matched, name_score, plaintiff_names}]
  - `existing_case_decision` string, nullable: How the merge target was chosen: phone_and_name | llm | none | manual | error (error = held for a human, nothing written)
  - `existing_case_reason` string, nullable
  - `merged_into_existing` boolean: The intake was merged into an existing case (sa_case_id) instead of creating one
  - `status` string
  - `sa_contact_id` integer, nullable
  - `sa_case_id` integer, nullable
  - `sa_case_number` string, nullable
  - `was_dry_run` boolean, nullable
  - `auto_promoted` boolean
  - `enrichment` object, nullable: Rich extraction: plaintiff role, injuries, treatment, medical providers, insurance, vehicle, referral source and tags (see DraftSmartAdvocateEnrichment)
  - `promote_steps` object[], nullable: Per-step promote outcomes [{key, label, status: ok|skipped|failed, detail, sa_id}]; failed steps can be re-run via the retry-steps endpoint
  - `additional_plaintiffs` object[], nullable: Others the call takes on as plaintiffs on the same case (see DraftAdditionalPlaintiff), each with its push outcome under 'push' once pushed; null when the firm doesn't add them
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, nullable

## Other responses

- `422`: Validation Error

## Changes

- **2026-11-02** `de90a8dcbc07`: 1 info
  - added the optional property `additional_plaintiffs` to the response with the `200` status
- **2026-10-20** `0b14aa0ec87c`: 1 info
  - added the new optional request property `confirm_identity`
- **2026-09-29** `318400082d74`: 1 info
  - added the new optional request property `expect_new_case`
- **2026-09-28** `cb38229a1f17`: 6 info
  - added the new optional request property `force_new_case`
  - added the new optional request property `merge_into_case_id`
  - added the optional property `existing_case_candidates` to the response with the `200` status
  - added the optional property `existing_case_decision` to the response with the `200` status
  - …2 more
- **2026-09-11** `546117b4e7b4`: 3 info
  - added the new optional request property `enrichment`
  - added the optional property `enrichment` to the response with the `200` status
  - added the optional property `promote_steps` to the response with the `200` status

[Operation history](https://skmtc.dev/openintake/apis/openintake-api/changes/smartadvocate/intake-draft/:smartadvocate_intake_draft_id/promote/post.md)

---

[API](https://skmtc.dev/openintake/apis/openintake-api.md) - [All operations](https://skmtc.dev/openintake/apis/openintake-api/llms.txt) - [OpenAPI document](https://skmtc.dev/openintake/apis/openintake-api/revisions/de90a8dcbc07?raw)
