# NewExemptionCertificateInput

input type

Create-input to CAPTURE an ExemptionCertificate. The tenant (org group) is derived SERVER-SIDE from the principal; every scoped jurisdiction is a SHARED-canonical ref — each must EXIST and be ACTIVE (CONFLICT/REF_STATE naming the first non-live one), deliberately NOT tenant-scoped; categories validate against the canned TaxCategory registry; the capture is immutable except caption/code/docRef — correct by revoke + re-capture.

## Fields

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `caption` | [String](/types/#scalars) | no | Optional: when omitted the per-type default applies — the capture coordinate ('<certType> cert <certificateNumber> — <holderName>'); when supplied it must be non-blank. |
| `certType` | [ExemptionCertType](/types/ExemptionCertType/) `ExemptionCertType!` | yes | No further notes. |
| `certificateNumber` | [String](/types/#scalars) `String!` | yes | The issuer's certificate number (non-blank; STRICT). |
| `holderName` | [String](/types/#scalars) `String!` | yes | The certificate holder, captured inline (customer-linked). |
| `jurisdictionIds` | [ID](/types/#scalars) `[ID!]!` | yes | The covered jurisdictions (1..25; shared-canonical refs — each exists + ACTIVE). |
| `categoryIds` | [TaxCategory](/types/TaxCategory/) `[TaxCategory!]` | no | The covered categories — ABSENT = all (the blanket-cert shape); supplied lists are non-empty. |
| `expiresAt` | [String](/types/#scalars) | no | Optional expiry (UTC ISO-8601) — ABSENT = non-expiring. |
| `docRef` | [String](/types/#scalars) | no | No further notes. |
| `orgCustomerId` | [ID](/types/#scalars) | no | The holder OrgCustomer — in-tenant + NON-doomed at set. |
| `code` | [String](/types/#scalars) | no | No further notes. |

## Used by

- [createExemptionCertificate](/reference/exemption-certificate/createExemptionCertificate/)
