> ## Documentation Index
> Fetch the complete documentation index at: https://docs.carewithemma.com/llms.txt
> Use this file to discover all available pages before exploring further.

# EMR Scheduling Tools

> The tools Emma calls mid-conversation to verify a patient and manage their appointment

Same calling convention as the other Live-Call Tools pages — authenticated with x-vapi-secret, not a dashboard JWT.

<Note>
  Which tools a call gets depends on its workflow. New Patient Journey calls get check\_availability and book\_appointment. Cancellation, Reschedule, and Care-Gap follow-up calls get verify\_patient, get\_upcoming\_appointment, check\_availability, reschedule\_appointment, cancel\_appointment, and document\_and\_escalate, but only when the clinic has the EMR sandbox turned on (see [Sandbox Configuration](/api-reference/guides/sandbox-configuration)). Emma's internal test calls can also use them.
</Note>

```text theme={null}
POST /emr-tools/:toolName
```

## verify\_patient

Checks a spoken date of birth against the patient already matched by phone number.

<ParamField body="dateOfBirth" type="string" required />

```json Result theme={null}
{ "verified": true }
```

A patient with no date of birth on file is treated as verified automatically — there's nothing to check a mismatch against.

## check\_availability

Lists open slots around a given date, optionally for a specific provider.

<ParamField body="providerName" type="string">
  Defaults to any provider if omitted
</ParamField>

<ParamField body="aroundDate" type="string">
  Defaults to today if omitted
</ParamField>

```json Result theme={null}
{ "slots": [ { "slotId": "slot-01", "providerName": "Dr. Patel", "startsAt": "2026-09-15T14:30:00.000Z", "startsAtSpoken": "Tuesday at 2:30 PM" } ] }
```

startsAtSpoken is computed server-side in the clinic's own timezone — the model is never asked to work out weekday or local time from the raw ISO string itself.

## book\_appointment

Books the slot the caller chose.

<ParamField body="providerName" type="string" required />

<ParamField body="visitType" type="string" required />

<ParamField body="scheduledAt" type="string" required />

```json Result theme={null}
{ "success": true, "appointmentId": "appt-001", "scheduledAt": "2026-09-15T14:30:00.000Z", "scheduledAtSpoken": "Tuesday at 2:30 PM", "status": "booked" }
```

A slot that's already taken returns success: false with a reason rather than a shape error — there's no separate conflict status code on this route the way there is on the FHIR facade's \$book.

## get\_upcoming\_appointment

Looks up the patient's next scheduled appointment, if any. No arguments.

```json Result theme={null}
{ "found": true, "appointmentId": "appt-001", "providerName": "Dr. Patel", "scheduledAt": "2026-09-15T14:30:00.000Z", "scheduledAtSpoken": "Tuesday at 2:30 PM", "status": "booked" }
```

found: false when there's nothing on the books.

## reschedule\_appointment

Moves the patient's upcoming appointment to a new time.

<ParamField body="newDateTime" type="string" required />

```json Result theme={null}
{ "success": true, "appointmentId": "appt-001", "scheduledAt": "2026-09-16T15:00:00.000Z", "status": "booked" }
```

Fails with error: "no appointment on file" if the patient has nothing upcoming to move.

## cancel\_appointment

Cancels the patient's upcoming appointment. No arguments.

```json Result theme={null}
{ "success": true, "status": "cancelled" }
```

## document\_and\_escalate

Records clinical findings from the call — lab orders, referrals, medication notes — and optionally flags the conversation for the clinical team.

<ParamField body="labOrderNote" type="string" />

<ParamField body="referralNote" type="string" />

<ParamField body="medicationNote" type="string" />

<ParamField body="escalateToClinicalTeam" type="boolean" />

<ParamField body="escalationReason" type="string" />

<ParamField body="requestExternalRecords" type="boolean" />

```json Result theme={null}
{ "success": true }
```
