# NewAffiliateInput

input type

Create-input for an Affiliate. The tenant is derived SERVER-SIDE; ⚠ the caption is REQUIRED at the boundary (an external promoter has no derivable name); codes normalize + grammar-gate + reserve their markers IN the create transaction; each couponId resolves live same-group; the ACTIVE bound gates kit-side.

## Fields

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `caption` | [String](/types/#scalars) | no | Optional: when omitted the per-type default applies — NONE — the divergence: an external promoter has no derivable default name, so an omitted caption refuses VALIDATION/INVALID at the boundary instead of defaulting; when supplied it must be non-blank. |
| `organizationIds` | [ID](/types/#scalars) `[ID!]` | no | The canned-pool selection — ABSENT = every org in the group. |
| `codes` | [AffiliateCodeInput](/types/AffiliateCodeInput/) `[AffiliateCodeInput!]` | no | ≤ 8 referral codes — normalized server-side; unique in-affiliate post-normalization; each reserves the org-group marker (CONFLICT/REFERRAL_CODE_TAKEN names a live holder). |
| `ratePpm` | [Int](/types/#scalars) | no | The flat order-net rate (ppm) — ABSENT = tracking-only. |
| `consumerId` | [ID](/types/#scalars) | no | The shopper link — live-gated (in-tenant + NOT-doomed Consumer). |
| `handle` | [String](/types/#scalars) | no | The public handle (1..64; NOT unique — ruling). |
| `bio` | [String](/types/#scalars) | no | ≤2000. |
| `socialLinks` | [String](/types/#scalars) `[String!]` | no | ≤8 url-ish strings. |
| `audienceSize` | [Int](/types/#scalars) | no | ≥0 (informational). |
| `nicheTags` | [String](/types/#scalars) `[String!]` | no | ≤16 plain strings (NOT Tag refs). |

## Used by

- [createAffiliate](/reference/affiliate/createAffiliate/)
