---
title: "POST /api/Vaccinations"
method: POST
path: "/api/Vaccinations"
tags: ["Vaccinations"]
---

# POST /api/Vaccinations

`POST /api/Vaccinations`

## Request body

- CreateVaccinationRecordRequest — Request to create a new vaccination record
  - `patientId` string, required
  - `appointmentId` string, nullable
  - `vaccineTypeId` string, required
  - `administeredDate` string, date-time, required
  - `expirationDate` string, date-time, nullable
  - `vaccineExpirationDate` string, date-time, nullable — Physical vaccine vial/lot expiration date (distinct from the next-due DateTime? CreateVaccinationRecordRequest.ExpirationDate).
  - `lotNumber` string, nullable
  - `manufacturer` string, nullable
  - `route` string, nullable
  - `site` string, nullable
  - `administeredById` string, nullable — Who physically gave the injection. Null = not recorded / external — never defaulted to the caller (PR #858).
  - `doctorOfRecordId` string, nullable — The DVM of record for this dose. Null = resolve the default: the appointment's assigned provider when string? CreateVaccinationRecordRequest.AppointmentId is set and that user is provider-flagged, else none. Set bool CreateVaccinationRecordRequest.NoDoctorOfRecord to force "no doctor" despite an appointment default. The two "unset" meanings are deliberately separate fields — an empty string is never a sentinel here (see the PR #858 ""-collision).
  - `noDoctorOfRecord` boolean — True = explicitly no doctor of record (external dose); suppresses the appointment default.
  - `notes` string, nullable
  - `inventoryTransactionId` string, nullable

## Response `201`

Created

- VaccinationRecordDto — Vaccination record with related entities
  - `id` string
  - `patientId` string
  - `appointmentId` string, nullable
  - `vaccineType` VaccineTypeSummaryDto — Vaccine type summary for dropdowns and lists
    - `id` string
    - `code` string
    - `name` string
    - `species` string
    - `isCore` boolean
    - `isRabies` boolean
  - `administeredDate` string, date-time
  - `expirationDate` string, date-time, nullable — Next-due date (when the current dose lapses). Not the vial expiry — see DateTime? VaccinationRecordDto.VaccineExpirationDate.
  - `vaccineExpirationDate` string, date-time, nullable — Physical vaccine vial/lot expiration date (distinct from the next-due DateTime? VaccinationRecordDto.ExpirationDate).
  - `administeredBy` UserSummaryDto
    - `id` string
    - `email` string
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `displayName` string, nullable
    - `type` string
    - `roleId` string, nullable
    - `roleName` string, nullable
  - `doctorOfRecord` UserSummaryDto
    - `id` string
    - `email` string
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `displayName` string, nullable
    - `type` string
    - `roleId` string, nullable
    - `roleName` string, nullable
  - `lotNumber` string, nullable
  - `manufacturer` string, nullable
  - `route` string, nullable
  - `site` string, nullable
  - `notes` string, nullable
  - `inventoryTransactionId` string, nullable
  - `scheduleStageSequence` union — Schedule stage this dose was resolved to at administration (1 = first dose / series restart); null for legacy records.
    - integer
    - string, int32
  - `hasUnresolvedLot` boolean — True when the underlying inventory lot is a temporary placeholder awaiting resolution. Certificate generation is blocked while this is true.
  - `isVoided` boolean — True when the dose was retracted (billing line voided, or a mis-entry corrected). The record stays on the chart for audit but is not a valid dose: it drives no reminders, does not count toward vaccination status or schedule stage, and cannot be certified. Render it struck through.
  - `voidedAt` string, date-time, nullable
  - `voidedBy` UserSummaryDto
    - `id` string
    - `email` string
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `displayName` string, nullable
    - `type` string
    - `roleId` string, nullable
    - `roleName` string, nullable
  - `voidReason` string, nullable
  - `createdAt` string, date-time
  - `updatedAt` string, date-time

## Other responses

- `400` — Bad Request

---

[API](https://skmtc.net/clinicos/apis/pawthosx-business-api-v1.md) · [All operations](https://skmtc.net/clinicos/apis/pawthosx-business-api-v1/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/clinicos/pawthosx-business-api-v1/versions/a905bde4e796/schema)
