---
title: "Deny (provider gate mirrors approve). Terminal; nothing billable exists."
method: POST
path: "/medication-requests/{id}/deny"
tags: ["MedicationRequests"]
---

# Deny (provider gate mirrors approve). Terminal; nothing billable exists.

`POST /medication-requests/{id}/deny`

## Request

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

## Path parameters

- `id` string, required

## Request body

- DenyMedicationRequestDto
  - `reason` string

## Response `200`

OK

- MedicationRequestDto: A medication request with its links and DERIVED billing state (design §5.4 — never stored, always computed from the link chain).
  - `id` string
  - `patientId` string
  - `patientName` string, nullable
  - `clientId` string, nullable
  - `inventoryItemId` string, nullable
  - `medicationName` string, nullable
  - `freeTextMedication` string, nullable
  - `requestedQuantity` union
    - number, double
    - string, double
  - `notes` string, nullable
  - `source` string
  - `isOtc` boolean
  - `isControlled` boolean: Whether the linked inventory item carries any DEA/controlled-substance signal. Mirrors the approval gate's own controlled test (RxGovernanceService.IsControlledItem): a controlled item always needs a primary provider to approve or deny, whatever RxGovernanceSettings says. False for an unresolved free-text request — there is no item to judge yet, so read it together with InventoryItemId.
  - `fulfillmentMethod` string, nullable
  - `status` string
  - `billingState` string: Derived: none | quoted | quote_removed | unbilled | invoiced | paid. "unbilled" is the "Ready to bill" worklist predicate.
  - `requestedById` string, nullable
  - `requestedByName` string, nullable
  - `requestedAt` string, date-time
  - `approvedById` string, nullable
  - `approvedByName` string, nullable
  - `approvedAt` string, date-time, nullable
  - `deniedById` string, nullable
  - `deniedAt` string, date-time, nullable
  - `denialReason` string, nullable
  - `cancelledById` string, nullable
  - `cancelledAt` string, date-time, nullable
  - `cancelReason` string, nullable
  - `dispensedAt` string, date-time, nullable
  - `prescriptionId` string, nullable
  - `prescriptionItemId` string, nullable
  - `estimateId` string, nullable
  - `estimateLineItemId` string, nullable
  - `targetEstimateId` string, nullable: The estimate chosen at capture for the line approval will create (ITE-1713). string? MedicationRequestDto.EstimateId is where the line actually is, once it exists.
  - `targetEstimateNumber` string, nullable
  - `targetEstimateIsVisit` boolean: True when string? MedicationRequestDto.TargetEstimateId is a visit's (appointment's) estimate.
  - `targetEstimateIsOpen` boolean: False when string? MedicationRequestDto.TargetEstimateId has been invoiced or declined since capture: approval will put the line on a fresh estimate instead, so it is not a usable choice.
  - `invoiceId` string, nullable
  - `renewalOfPrescriptionId` string, nullable
  - `renewalContext` MedicationRequestRenewalContextDto: Prior-prescription context for a renewal request (design §7): what the doctor sees on the approve screen, with server-evaluated refill eligibility.
    - `medicationName` string, nullable
    - `prescriptionStatus` string
    - `refillsAllowed` union
      - integer
      - string, int32
    - `refillsUsed` union
      - integer
      - string, int32
    - `refillsRemaining` union
      - integer
      - string, int32
    - `refillsPrn` boolean: PRN refills: unlimited until DateOnly? MedicationRequestRenewalContextDto.ValidUntil.
    - `lastDispensedAt` string, date-time, nullable
    - `validUntil` string, date, nullable
    - `refillEligible` boolean: True when "use a refill" may be chosen at approval.
    - `refillBlockedReason` string, nullable: rx_not_active | schedule_ii | refills_exhausted | rx_expired.
  - `suggestedProviderId` string, nullable
  - `suggestedDosage` string, nullable
  - `suggestedFrequency` string, nullable
  - `suggestedDuration` string, nullable
  - `suggestedInstructions` string, nullable
  - `suggestedRefillsAllowed` union
    - integer
    - string, int32
  - `createdAt` string, date-time
  - `updatedAt` string, date-time

## Other responses

- `403`: Forbidden
- `409`: Conflict

## Changes

- **2026-10-28** `099cf36186e0`: 15 info
  - added the optional property `renewalContext/oneOf[#/components/schemas/MedicationRequestRenewalContextDto]/refillsPrn` to the response with the `200` status (media type: text/plain)
  - added the optional property `renewalContext/oneOf[#/components/schemas/MedicationRequestRenewalContextDto]/refillsPrn` to the response with the `200` status (media type: application/json)
  - added the optional property `renewalContext/oneOf[#/components/schemas/MedicationRequestRenewalContextDto]/refillsPrn` to the response with the `200` status (media type: text/json)
  - added the optional property `targetEstimateId` to the response with the `200` status (media type: text/plain)
  - …11 more
- **2026-09-17** `d4ae30be0619`: 3 info
  - added the optional property `isControlled` to the response with the `200` status (media type: text/plain)
  - added the optional property `isControlled` to the response with the `200` status (media type: application/json)
  - added the optional property `isControlled` to the response with the `200` status (media type: text/json)

[Operation history](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/medication-requests/:id/deny/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)
