---
title: "POST /api/vaccine-certificate-records"
method: POST
path: "/api/vaccine-certificate-records"
tags: ["VaccineCertificateRecords"]
---

# POST /api/vaccine-certificate-records

`POST /api/vaccine-certificate-records`

## Request body

- IssueVaccineCertificateRequest — Request to issue (write) a vaccine certificate record for a vaccination event. The snapshot is built server-side from current data — callers never supply printed values.
  - `vaccinationRecordId` string, required
  - `rabiesTagId` string, nullable — Optional assigned rabies tag id (rabies-tag domain lands later).
  - `rabiesTagNumber` string, nullable — Optional human-readable rabies tag number to freeze onto the certificate.
  - `certifyingUserId` string, nullable — The veterinarian certifying this certificate — chosen by the user at issuance (the administering staff member may be a tech/RVT and must not appear as the certifying DVM). When absent, issuance falls back to the record's administering user.

## Response `201`

Created

- VaccineCertificateDto — An issued vaccine certificate record (the persisted, queryable system-of-record). Rendering/printing is a separate concern handled by the certificate print pipeline.
  - `id` string
  - `vaccinationRecordId` string
  - `patientId` string
  - `clientId` string
  - `rabiesTagId` string, nullable
  - `rabiesTagNumber` string, nullable
  - `status` string
  - `issuedAt` string, date-time
  - `issuedBy` UserSummaryDto
    - `id` string
    - `email` string
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `displayName` string, nullable
    - `type` string
    - `roleId` string, nullable
    - `roleName` string, nullable
  - `supersededByCertificateId` string, nullable
  - `revokedAt` string, date-time, nullable
  - `revocationReason` string, nullable
  - `snapshot` VaccineCertificateSnapshotDto — Frozen copy of the printed values, surfaced for read/preview.
    - `patientName` string, nullable
    - `species` string, nullable
    - `breed` string, nullable
    - `color` string, nullable
    - `sex` string, nullable
    - `spayedNeutered` boolean, nullable
    - `dateOfBirth` string, date-time, nullable
    - `microchipNumber` string, nullable
    - `weightLbs` union — Patient's most recent recorded weight in pounds at issuance, when available.
      - number, double
      - string, double
    - `ownerName` string, nullable
    - `ownerAddress` string, nullable
    - `ownerPhone` string, nullable
    - `ownerEmail` string, nullable
    - `vaccineName` string, nullable
    - `vaccineCode` string, nullable
    - `isRabies` boolean, nullable
    - `manufacturer` string, nullable
    - `lotNumber` string, nullable
    - `administeredDate` string, date-time, nullable
    - `vaccineExpirationDate` string, date-time, nullable — Physical vaccine vial/lot expiry (not the next-due date).
    - `rabiesDueDate` string, date-time, nullable — Next-due date (when this dose lapses).
    - `durationMonths` union
      - integer
      - string, int32
    - `rabiesTagNumber` string, nullable
    - `veterinarianName` string, nullable
    - `veterinaryLicenseNumber` string, nullable
    - `licenseState` string, nullable
    - `usdaNumber` string, nullable
    - `hasVeterinarianSignature` boolean — Whether the administering veterinarian had a signature on file when this certificate was issued (frozen at issuance). Drives the "no signature on file" warning. The raw signature image itself is intentionally not exposed here — it's only used server-side for rendering.
    - `clinicName` string, nullable
    - `clinicAddress` string, nullable
    - `clinicPhone` string, nullable
  - `createdAt` string, date-time
  - `updatedAt` string, date-time
  - `warnings` string[] — Non-blocking warnings computed at issuance for recommended-but-missing certificate fields (vial expiration, rabies tag, DVM signature, license number). Surfaced to the UI so staff can backfill; the certificate still issues. Empty when nothing is missing or on read-back.
  - `isStale` boolean — True when the underlying vaccination record was edited AFTER this certificate froze its snapshot (ITE-281) — the printed values may no longer match the record. Prompt a reissue; never reissue silently. Computed on read for the current-certificate endpoint only.

## Other responses

- `400` — Bad Request
- `404` — Not Found

---

[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/revisions/d8d7501dde48/schema)
