# ConsentDecisionInput

input type

STAFF decide-input for grantConsent/withdrawConsent: the acted-on consumer is NAMED and the capture surface is REQUIRED.

## Fields

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `consumerId` | [ID](/types/#scalars) `ID!` | yes | The acted-on Consumer (tenant-scoped; NOT doomed — an erased subject takes no decisions; ⚠ a SUSPENDED consumer stays LEGAL here: consent is the data subject's right, independent of the merchant hold). |
| `purposeId` | [ID](/types/#scalars) `ID!` | yes | The ConsentPurpose decided on (tenant-scoped + ACTIVE — a retired purpose refuses CONFLICT/REF_STATE naming it). |
| `policyVersion` | [String](/types/#scalars) `String!` | yes | The consent-notice/policy version PRESENTED at this decision (1..128 — REQUIRED caller data; a Policy/notice CONSTRUCT is the named deferral). |
| `captureSurface` | [String](/types/#scalars) `String!` | yes | WHERE the decision was captured — storefront \| pos \| back_office \| cli \| import (REQUIRED — no default). |
| `captureLocale` | [String](/types/#scalars) | no | The locale PRESENTED (canonical BCP-47 core); optional. |

## Used by

- [grantConsent](/reference/selling/grantConsent/)
- [withdrawConsent](/reference/selling/withdrawConsent/)
