---
title: "Creates the forms for the visit, without sending anything, and targets a tablet or QR."
method: POST
path: "/appointments/{appointmentId}/form-handoffs"
tags: ["FormHandoffs"]
---

# Creates the forms for the visit, without sending anything, and targets a tablet or QR.

`POST /appointments/{appointmentId}/form-handoffs`

## Request

- Base URL: `https://api.clinicos.vet/backend/business`
- URL: `https://api.clinicos.vet/backend/business/appointments/{appointmentId}/form-handoffs`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/docs/appointments/:appointmentId/form-handoffs/post.ts> (a function with typed inputs; its response is checked against the schema)

## Path parameters

- `appointmentId` string, required

## Request body

- CreateFormHandoffRequest
  - `items` FormHandoffItemRequest[], nullable, required
    - `questionnaireId` string, nullable, required
    - `patientId` string, nullable, required: The pet the form is about. Omitted → the appointment's patient. Ignored for client-anchored forms (new-client details), which are filled once per handoff.
  - `target` FormHandoffTargetRequest, required
    - `kind` 'Device' | 'Qr', required
    - `deviceId` string, nullable, required

## Response `201`

Created

- FormHandoffDto
  - `id` string, required
  - `appointmentId` string, required
  - `clientId` string, required
  - `status` 'Pending' | 'Opened' | 'Completed' | 'Cancelled' | 'Expired', required
  - `targetKind` 'Device' | 'Qr', required
  - `targetDeviceId` string, nullable, required
  - `targetDeviceName` string, nullable, required
  - `launchedByUserId` string, nullable, required
  - `expiresAt` string, date-time, required
  - `createdAt` string, date-time, required
  - `openedAt` string, date-time, nullable, required
  - `completedAt` string, date-time, nullable, required
  - `cancelledAt` string, date-time, nullable, required
  - `items` FormHandoffItemDto[], required
    - `id` string, required
    - `order` union, required
      - integer
      - string, int32
    - `questionnaireId` string, required
    - `questionnaireName` string, required
    - `questionnaireType` 'Intake' | 'PreVisit' | 'PostVisit' | 'Satisfaction' | 'Custom' | 'NewClient' | 'AppointmentConfirmation' | 'Consent' | 'Handout', required
    - `patientId` string, nullable, required
    - `patientName` string, nullable, required
    - `questionnaireResponseId` string, required
    - `submittedAt` string, date-time, nullable, required
  - `qr` FormHandoffQrDto: The code staff show the client for a live QR handoff (ITE-1090): the page URL, carrying the handoff's bearer token, and when it stops working. Returned by create and retarget to QR, and by `GET /form-handoffs/{id}/qr`; never in the list.
    - `url` string, required
    - `expiresAt` string, date-time, required
  - `cancelledByUserId` string, nullable

## Other responses

- `400`: Bad Request
- `404`: Not Found
- `409`: Conflict

## Changes

- **2026-10-28** `099cf36186e0`: 3 warning
  - added the new `Handout` enum value to the `items/items/questionnaireType` response property for the response status `201` (media type: text/plain)
  - added the new `Handout` enum value to the `items/items/questionnaireType` response property for the response status `201` (media type: application/json)
  - added the new `Handout` enum value to the `items/items/questionnaireType` response property for the response status `201` (media type: text/json)
- **2026-10-21** `85ee96c0bb96`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/appointments/:appointmentId/form-handoffs/post.md)

---

[API](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1.md) - [All operations](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/revisions/099cf36186e0?raw)
