{
  "version": "2.0",
  "service": "<p>AWS End User Messaging provides a set of APIs to manage brand profiles, synchronize brand profile data with SMS and Rich Communication Services (RCS) registrations, and send and validate one-time passcodes across the SMS, voice, and WhatsApp channels.</p>",
  "operations": {
    "CreateBrandProfile": "<p>Creates a brand profile. A brand profile is a lightweight container that holds your brand identity information as flexible attributes. After you create a brand profile, use the CreateBrandProfileAttributes operation to add company information, addresses, compliance documents, and logos.</p>",
    "CreateBrandProfileAttributes": "<p>Creates up to 10 attributes for a brand profile in a single request. For attributes of type IMAGE or DOCUMENT, the response includes a presigned Amazon S3 URL that you use to upload the media. This operation is atomic: either all of the attributes are created, or none of them are.</p>",
    "CreateBrandProfileFromRegistration": "<p>Creates a brand profile and populates its attributes from an existing registration. This operation runs asynchronously. Use the GetJob operation to track its progress.</p>",
    "CreateNotifyCodeConfiguration": "<p>Creates a notify code configuration. A notify code configuration is a reusable policy that defines how one-time passcodes are generated and rendered, including the code type, length, validity period, maximum number of attempts, and channel templates.</p>",
    "CreateRegistrationsFromBrandProfile": "<p>Creates one or more registrations in the DRAFT state and prefills their fields from the attributes of a brand profile. This operation runs asynchronously. Use the GetJob operation to track its progress.</p>",
    "DeleteBrandProfile": "<p>Deletes a brand profile. This operation also deletes the attributes of the profile and any associated media. The request fails if deletion protection is enabled for the profile.</p>",
    "DeleteBrandProfileAttribute": "<p>Deletes a brand profile attribute. If the attribute stores media, this operation also deletes the associated media.</p>",
    "DeleteNotifyCodeConfiguration": "<p>Deletes a notify code configuration. Verifications that are already in progress are not affected, because they capture the policy at the time that the passcode was sent.</p>",
    "GetBrandProfile": "<p>Retrieves the metadata for a brand profile, including its name, status, deletion protection setting, and timestamps. To retrieve the attributes of the profile, use the ListBrandProfileAttributes operation.</p>",
    "GetBrandProfileAttribute": "<p>Retrieves a single brand profile attribute.</p>",
    "GetJob": "<p>Retrieves the current state of an asynchronous job, including its status and any resources that it created or updated.</p>",
    "GetNotifyCodeConfiguration": "<p>Retrieves a notify code configuration.</p>",
    "ListBrandProfileAttributes": "<p>Retrieves a paginated list of the attributes for a brand profile.</p>",
    "ListBrandProfiles": "<p>Retrieves a paginated list of the brand profiles in your account. Use the nextToken parameter to retrieve additional results.</p>",
    "ListJobs": "<p>Retrieves a paginated list of the asynchronous jobs in your account. You can filter the results by status, brand profile, or operation type.</p>",
    "ListNotifyCodeConfigurations": "<p>Retrieves a paginated list of the notify code configurations in your account.</p>",
    "ListRegistrationsFromBrandProfile": "<p>Retrieves a paginated list of the registrations that were created from a brand profile through the synchronization operations.</p>",
    "ListTagsForResource": "<p>Retrieves the tags that are associated with a resource.</p>",
    "SendNotifyCodeVerification": "<p>Generates a one-time passcode and delivers it to a recipient over the requested channel. The passcode policy is captured from the referenced notify code configuration at the time of the request, so later updates to the configuration do not affect verifications that are already in progress.</p>",
    "TagResource": "<p>Adds or overwrites the tags on a resource.</p>",
    "UntagResource": "<p>Removes the specified tags from a resource.</p>",
    "UpdateBrandProfile": "<p>Updates the name or the deletion protection setting of a brand profile. To change the information that is stored in the profile, use the brand profile attribute operations.</p>",
    "UpdateBrandProfileAttribute": "<p>Updates the value, description, or category of an existing brand profile attribute.</p>",
    "UpdateBrandProfileFromRegistration": "<p>Imports or refreshes the attributes of an existing brand profile from an existing registration. This operation runs asynchronously. Use the GetJob operation to track its progress.</p>",
    "UpdateNotifyCodeConfiguration": "<p>Updates the mutable fields of a notify code configuration. Only the fields that you supply are changed. For the template and language fields, supplying an empty value clears the currently stored value.</p>",
    "UpdateRegistrationsFromBrandProfile": "<p>Repushes the attributes of a brand profile into existing DRAFT registrations. This operation runs asynchronously. Use the GetJob operation to track its progress.</p>",
    "ValidateNotifyCodeVerification": "<p>Validates a one-time passcode that a recipient submitted. Validation succeeds when the passcode matches, the validity period has not elapsed, and the maximum number of attempts has not been exceeded.</p>"
  },
  "shapes": {
    "AccessDeniedException": {
      "base": "<p>You do not have sufficient access to perform this action.</p>",
      "refs": {}
    },
    "AmazonResourceName": {
      "base": "<p>Amazon Resource Name.</p>",
      "refs": {
        "BrandProfileInfo$brandProfileArn": "<p>The Amazon Resource Name (ARN) of the brand profile.</p>",
        "CreateBrandProfileOutput$brandProfileArn": "<p>The Amazon Resource Name (ARN) of the brand profile.</p>",
        "DeleteBrandProfileOutput$brandProfileArn": "<p>The Amazon Resource Name (ARN) of the brand profile.</p>",
        "GetBrandProfileOutput$brandProfileArn": "<p>The Amazon Resource Name (ARN) of the brand profile.</p>",
        "JobResource$resourceArn": "<p>The Amazon Resource Name (ARN) of the resource.</p>",
        "ListTagsForResourceInput$resourceArn": "<p>The Amazon Resource Name (ARN) of the resource.</p>",
        "NotifyCodeConfiguration$notifyCodeConfigurationArn": "<p>The Amazon Resource Name (ARN) of the notify code configuration.</p>",
        "TagResourceInput$resourceArn": "<p>The Amazon Resource Name (ARN) of the resource.</p>",
        "UntagResourceInput$resourceArn": "<p>The Amazon Resource Name (ARN) of the resource.</p>",
        "UpdateBrandProfileOutput$brandProfileArn": "<p>The Amazon Resource Name (ARN) of the brand profile.</p>"
      }
    },
    "AttachmentBody": {
      "base": "<p>Attachment Body</p>",
      "refs": {
        "BrandProfileAttributeInput$attachmentBody": "<p>The binary content for an attribute of type IMAGE or DOCUMENT. The content is base64-encoded when it is sent over the wire.</p>"
      }
    },
    "Blob": {
      "base": null,
      "refs": {
        "UpdateBrandProfileAttributeInput$attachmentBody": "<p>The binary content for an attribute of type IMAGE or DOCUMENT. The content is base64-encoded when it is sent over the wire.</p>"
      }
    },
    "Boolean": {
      "base": null,
      "refs": {
        "BrandProfileInfo$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "CreateBrandProfileFromRegistrationInput$smartMatch": "<p>Specifies whether to use semantic field mapping between brand profile attributes and registration fields. The default is true. When false, the service maps fields using a fixed set of standard field types.</p>",
        "CreateBrandProfileInput$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "CreateBrandProfileOutput$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "CreateNotifyCodeConfigurationInput$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "CreateRegistrationsFromBrandProfileInput$smartMatch": "<p>Specifies whether to use semantic field mapping between brand profile attributes and registration fields. The default is true. When false, the service maps fields using a fixed set of standard field types.</p>",
        "GetBrandProfileOutput$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "NotifyCodeConfiguration$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "RegistrationAssociationSummary$smartMatchUsed": "<p>Specifies whether smart matching was used to create the association.</p>",
        "UpdateBrandProfileFromRegistrationInput$smartMatch": "<p>Specifies whether to use semantic field mapping between brand profile attributes and registration fields. The default is true. When false, the service maps fields using a fixed set of standard field types.</p>",
        "UpdateBrandProfileInput$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "UpdateBrandProfileOutput$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "UpdateNotifyCodeConfigurationInput$deletionProtectionEnabled": "<p>Specifies whether deletion protection is enabled. When enabled, the resource cannot be deleted until deletion protection is turned off.</p>",
        "UpdateRegistrationsFromBrandProfileInput$smartMatch": "<p>Specifies whether to use semantic field mapping between brand profile attributes and registration fields. The default is true. When false, the service maps fields using a fixed set of standard field types.</p>"
      }
    },
    "BrandProfileAttributeCategory": {
      "base": "<p>Category for the attribute. Validated against supported values at runtime (see FoodCourtConstants).</p>",
      "refs": {
        "BrandProfileAttributeInput$category": "<p>The category of the attribute.</p>",
        "BrandProfileAttributeSummary$category": "<p>The category of the attribute.</p>",
        "GetBrandProfileAttributeOutput$category": "<p>The category of the attribute.</p>",
        "UpdateBrandProfileAttributeInput$category": "<p>The category of the attribute.</p>",
        "UpdateBrandProfileAttributeOutput$category": "<p>The category of the attribute.</p>"
      }
    },
    "BrandProfileAttributeDescription": {
      "base": "<p>Attribute description.</p>",
      "refs": {
        "BrandProfileAttributeInput$description": "<p>A description of the attribute.</p>",
        "BrandProfileAttributeSummary$description": "<p>A description of the attribute.</p>",
        "GetBrandProfileAttributeOutput$description": "<p>A description of the attribute.</p>",
        "UpdateBrandProfileAttributeInput$description": "<p>A description of the attribute.</p>",
        "UpdateBrandProfileAttributeOutput$description": "<p>A description of the attribute.</p>"
      }
    },
    "BrandProfileAttributeInput": {
      "base": "<p>Specifies an attribute to create for a brand profile.</p>",
      "refs": {
        "BrandProfileAttributeInputList$member": null
      }
    },
    "BrandProfileAttributeInputList": {
      "base": null,
      "refs": {
        "CreateBrandProfileAttributesInput$attributes": "<p>The brand profile attributes.</p>"
      }
    },
    "BrandProfileAttributeName": {
      "base": "<p>Customer-provided attribute name (unique per brand profile). Alphanumeric, underscore, hyphen, and space only.</p>",
      "refs": {
        "BrandProfileAttributeInput$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>",
        "BrandProfileAttributeOutput$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>",
        "BrandProfileAttributeSummary$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>",
        "DeleteBrandProfileAttributeInput$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>",
        "DeleteBrandProfileAttributeOutput$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>",
        "GetBrandProfileAttributeInput$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>",
        "GetBrandProfileAttributeOutput$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>",
        "UpdateBrandProfileAttributeInput$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>",
        "UpdateBrandProfileAttributeOutput$attributeName": "<p>The name of the brand profile attribute. The name is unique within a brand profile.</p>"
      }
    },
    "BrandProfileAttributeOutput": {
      "base": "<p>Contains information about an attribute that was created for a brand profile.</p>",
      "refs": {
        "BrandProfileAttributeOutputList$member": null
      }
    },
    "BrandProfileAttributeOutputList": {
      "base": null,
      "refs": {
        "CreateBrandProfileAttributesOutput$attributes": "<p>The brand profile attributes.</p>"
      }
    },
    "BrandProfileAttributeSummary": {
      "base": "<p>Contains summary information about a brand profile attribute in a list response.</p>",
      "refs": {
        "BrandProfileAttributeSummaryList$member": null
      }
    },
    "BrandProfileAttributeSummaryList": {
      "base": null,
      "refs": {
        "ListBrandProfileAttributesOutput$brandProfileAttributes": "<p>The list of brand profile attributes.</p>"
      }
    },
    "BrandProfileAttributeType": {
      "base": "<p>Type of brand profile attribute. Drives whether a value is inline (TEXT) or referenced via a presigned media upload URL.</p>",
      "refs": {
        "BrandProfileAttributeInput$attributeType": "<p>The type of the attribute. TEXT stores an inline value. IMAGE and DOCUMENT store binary media that you upload.</p>",
        "BrandProfileAttributeOutput$attributeType": "<p>The type of the attribute. TEXT stores an inline value. IMAGE and DOCUMENT store binary media that you upload.</p>",
        "BrandProfileAttributeSummary$attributeType": "<p>The type of the attribute. TEXT stores an inline value. IMAGE and DOCUMENT store binary media that you upload.</p>",
        "GetBrandProfileAttributeOutput$attributeType": "<p>The type of the attribute. TEXT stores an inline value. IMAGE and DOCUMENT store binary media that you upload.</p>",
        "UpdateBrandProfileAttributeOutput$attributeType": "<p>The type of the attribute. TEXT stores an inline value. IMAGE and DOCUMENT store binary media that you upload.</p>"
      }
    },
    "BrandProfileAttributeValue": {
      "base": "<p>Attribute value for TEXT type.</p>",
      "refs": {
        "BrandProfileAttributeInput$attributeValue": "<p>The text value for the attribute. This value applies to attributes of type TEXT. For attributes of type IMAGE or DOCUMENT, provide the media through the attachment body instead.</p>",
        "GetBrandProfileAttributeOutput$attributeValue": "<p>The text value of the attribute. This value applies to attributes of type TEXT.</p>",
        "UpdateBrandProfileAttributeInput$attributeValue": "<p>The text value of the attribute. This value applies to attributes of type TEXT.</p>",
        "UpdateBrandProfileAttributeOutput$attributeValue": "<p>The text value of the attribute. This value applies to attributes of type TEXT.</p>"
      }
    },
    "BrandProfileIdOrArn": {
      "base": "<p>System-generated brand profile identifier or full ARN. Accepts either a bare ID (e.g., &quot;bp-abc12345678901234&quot;) or a full ARN (e.g., &quot;arn:aws:end-user-messaging:us-east-1:123456789012:brand-profile/bp-abc12345678901234&quot;). SDKs handle percent-encoding of ARN characters in path parameters transparently.</p>",
      "refs": {
        "BrandProfileInfo$brandProfileId": "<p>The unique identifier of the brand profile.</p>",
        "CreateBrandProfileAttributesInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "CreateBrandProfileOutput$brandProfileId": "<p>The unique identifier of the brand profile.</p>",
        "CreateRegistrationsFromBrandProfileInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "DeleteBrandProfileAttributeInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "DeleteBrandProfileAttributeOutput$brandProfileId": "<p>The unique identifier of the brand profile.</p>",
        "DeleteBrandProfileInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "DeleteBrandProfileOutput$brandProfileId": "<p>The unique identifier of the brand profile.</p>",
        "GetBrandProfileAttributeInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "GetBrandProfileInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "GetBrandProfileOutput$brandProfileId": "<p>The unique identifier of the brand profile.</p>",
        "Job$brandProfileId": "<p>The brand profile that the job operates on. This value is absent for operations that create a brand profile.</p>",
        "JobSummary$brandProfileId": "<p>The brand profile that the job operates on. This value is absent for operations that create a brand profile.</p>",
        "ListBrandProfileAttributesInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "ListJobsInput$brandProfileId": "<p>Filters the results to jobs for the specified brand profile.</p>",
        "ListRegistrationsFromBrandProfileInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "UpdateBrandProfileAttributeInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "UpdateBrandProfileFromRegistrationInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "UpdateBrandProfileInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "UpdateBrandProfileOutput$brandProfileId": "<p>The unique identifier of the brand profile.</p>",
        "UpdateRegistrationsFromBrandProfileInput$brandProfileId": "<p>The unique identifier of the brand profile. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>"
      }
    },
    "BrandProfileInfo": {
      "base": "<p>Contains information about a brand profile.</p>",
      "refs": {
        "BrandProfileInfoList$member": null
      }
    },
    "BrandProfileInfoList": {
      "base": null,
      "refs": {
        "ListBrandProfilesOutput$brandProfiles": "<p>The list of brand profiles.</p>"
      }
    },
    "BrandProfileName": {
      "base": "<p>Customer-provided brand profile name. Alphanumeric, underscore, hyphen, and space only.</p>",
      "refs": {
        "BrandProfileInfo$brandProfileName": "<p>The name of the brand profile. The name can contain alphanumeric characters, underscores, hyphens, and spaces.</p>",
        "CreateBrandProfileFromRegistrationInput$brandProfileName": "<p>The name of the brand profile. The name can contain alphanumeric characters, underscores, hyphens, and spaces.</p>",
        "CreateBrandProfileInput$brandProfileName": "<p>The name of the brand profile. The name can contain alphanumeric characters, underscores, hyphens, and spaces.</p>",
        "CreateBrandProfileOutput$brandProfileName": "<p>The name of the brand profile. The name can contain alphanumeric characters, underscores, hyphens, and spaces.</p>",
        "GetBrandProfileOutput$brandProfileName": "<p>The name of the brand profile. The name can contain alphanumeric characters, underscores, hyphens, and spaces.</p>",
        "UpdateBrandProfileInput$brandProfileName": "<p>The name of the brand profile. The name can contain alphanumeric characters, underscores, hyphens, and spaces.</p>",
        "UpdateBrandProfileOutput$brandProfileName": "<p>The name of the brand profile. The name can contain alphanumeric characters, underscores, hyphens, and spaces.</p>"
      }
    },
    "ChannelParameters": {
      "base": "<p>The channel-specific parameters used to render and deliver a one-time passcode. Each member configures the parameters for one delivery route. Populate only the channels that a configuration or send request supports. A notify code configuration can carry every channel at once, and a send request resolves to a single route that selects the matching channel at send time.</p>",
      "refs": {
        "CreateNotifyCodeConfigurationInput$channelParameters": "<p>The channel-specific parameters used to render and deliver the one-time passcode. Provide parameters for any subset of channels. Each member configures one delivery route, and the route that is selected at send time uses the matching channel.</p>",
        "NotifyCodeConfiguration$channelParameters": "<p>The channel-specific parameters used to render and deliver the one-time passcode. A configuration can carry parameters for every channel at once, and the send route selects the matching channel at send time.</p>",
        "SendNotifyCodeVerificationInput$overrideChannelParameters": "<p>The channel-specific parameters used to render and deliver the one-time passcode for this request. The route that is derived from the channel and the origination identity selects the matching channel. When you do not specify channel parameters, the service uses the parameters from the referenced notify code configuration.</p>"
      }
    },
    "ClientToken": {
      "base": "<p>Idempotency token for safe retries on Create operations.</p>",
      "refs": {
        "CreateBrandProfileAttributesInput$clientToken": "<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you do not specify a client token, the AWS SDK automatically generates one.</p>",
        "CreateBrandProfileFromRegistrationInput$clientToken": "<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you do not specify a client token, the AWS SDK automatically generates one.</p>",
        "CreateBrandProfileInput$clientToken": "<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you do not specify a client token, the AWS SDK automatically generates one.</p>",
        "CreateNotifyCodeConfigurationInput$clientToken": "<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you do not specify a client token, the AWS SDK automatically generates one.</p>",
        "CreateRegistrationsFromBrandProfileInput$clientToken": "<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you do not specify a client token, the AWS SDK automatically generates one.</p>",
        "UpdateBrandProfileFromRegistrationInput$clientToken": "<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you do not specify a client token, the AWS SDK automatically generates one.</p>",
        "UpdateRegistrationsFromBrandProfileInput$clientToken": "<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you do not specify a client token, the AWS SDK automatically generates one.</p>"
      }
    },
    "CodeConfigurationParameters": {
      "base": "<p>The passcode policy parameters that are grouped for reuse across a notify code configuration and its create request. Each member is optional. When you omit a member on a create request, no value is applied at create time and the default is applied when a passcode is sent.</p>",
      "refs": {
        "CreateNotifyCodeConfigurationInput$codeConfigurationParameters": "<p>The passcode policy parameters, including the code type, length, validity period, and maximum number of attempts. Each member is optional. When you omit a member, no value is applied at create time and the default is applied when a passcode is sent.</p>",
        "NotifyCodeConfiguration$codeConfigurationParameters": "<p>The passcode policy parameters, including the code type, length, validity period, and maximum number of attempts.</p>",
        "SendNotifyCodeVerificationInput$overrideCodeConfigurationParameters": "<p>The per-send overrides for the passcode policy parameters, including the code type, length, validity period, and maximum number of attempts. These values override the values from the referenced notify code configuration. When you do not specify a value, the value from the configuration is used, and if neither is set, the service default applies.</p>"
      }
    },
    "CodeLength": {
      "base": "<p>OTP code length (4-8 characters).</p>",
      "refs": {
        "CodeConfigurationParameters$codeLength": "<p>The number of characters in the one-time passcode. Valid values range from 4 through 8. When you do not specify a value, the default is applied when a passcode is sent.</p>",
        "UpdateCodeConfigurationParameters$codeLength": "<p>The updated number of characters in the one-time passcode. Valid values range from 4 through 8. Omit this member to preserve the current value.</p>"
      }
    },
    "CodeType": {
      "base": "<p>OTP character alphabet used by a NotifyCodeConfiguration.</p>",
      "refs": {
        "CodeConfigurationParameters$codeType": "<p>The character set used to generate the one-time passcode. Valid values are NUMERIC (digits only), ALPHA (uppercase letters only), and ALPHANUMERIC (uppercase letters and digits). When you do not specify a value, the default is applied when a passcode is sent.</p>",
        "UpdateCodeConfigurationParameters$codeType": "<p>The updated character set used to generate the one-time passcode. Omit this member to preserve the current value.</p>"
      }
    },
    "ConfigurationSetName": {
      "base": "<p>Configuration set name used to control event delivery for the verification message.</p>",
      "refs": {
        "SendNotifyCodeVerificationInput$configurationSetName": "<p>The name of the configuration set used to control how delivery events for the message are handled.</p>"
      }
    },
    "ConflictException": {
      "base": "<p>The request conflicts with the current state of the resource.</p>",
      "refs": {}
    },
    "ContextKey": {
      "base": "<p>Caller-supplied context propagated to delivery events for this verification.</p>",
      "refs": {
        "ContextMap$key": null
      }
    },
    "ContextMap": {
      "base": "<p>Caller-supplied context map propagated to delivery events for this verification.</p>",
      "refs": {
        "SendNotifyCodeVerificationInput$context": "<p>A map of custom key and value pairs that are propagated to the delivery events for this verification.</p>"
      }
    },
    "ContextValue": {
      "base": "<p>Caller-supplied context value. Blank space is not allowed at the front or end.</p>",
      "refs": {
        "ContextMap$value": null
      }
    },
    "CreateBrandProfileAttributesInput": {
      "base": null,
      "refs": {}
    },
    "CreateBrandProfileAttributesOutput": {
      "base": null,
      "refs": {}
    },
    "CreateBrandProfileFromRegistrationInput": {
      "base": null,
      "refs": {}
    },
    "CreateBrandProfileFromRegistrationOutput": {
      "base": null,
      "refs": {}
    },
    "CreateBrandProfileInput": {
      "base": null,
      "refs": {}
    },
    "CreateBrandProfileOutput": {
      "base": null,
      "refs": {}
    },
    "CreateNotifyCodeConfigurationInput": {
      "base": null,
      "refs": {}
    },
    "CreateNotifyCodeConfigurationOutput": {
      "base": null,
      "refs": {}
    },
    "CreateRegistrationsFromBrandProfileInput": {
      "base": null,
      "refs": {}
    },
    "CreateRegistrationsFromBrandProfileOutput": {
      "base": null,
      "refs": {}
    },
    "DeleteBrandProfileAttributeInput": {
      "base": null,
      "refs": {}
    },
    "DeleteBrandProfileAttributeOutput": {
      "base": null,
      "refs": {}
    },
    "DeleteBrandProfileInput": {
      "base": null,
      "refs": {}
    },
    "DeleteBrandProfileOutput": {
      "base": null,
      "refs": {}
    },
    "DeleteNotifyCodeConfigurationInput": {
      "base": null,
      "refs": {}
    },
    "DeleteNotifyCodeConfigurationOutput": {
      "base": null,
      "refs": {}
    },
    "DestinationCountryParameterKey": {
      "base": "<p>Key of a <code>DestinationCountryParameters</code> map entry. Up to 64 non-whitespace characters.</p>",
      "refs": {
        "DestinationCountryParameters$key": null,
        "UpdateDestinationCountryParameters$key": null
      }
    },
    "DestinationCountryParameterValue": {
      "base": "<p>Value of a <code>DestinationCountryParameters</code> map entry. Up to 64 non-whitespace characters.</p>",
      "refs": {
        "DestinationCountryParameters$value": null,
        "UpdateDestinationCountryParameters$value": null
      }
    },
    "DestinationCountryParameters": {
      "base": "<p>Country-specific OTP delivery parameters as a map of destination-country-parameter keys to values.</p>",
      "refs": {
        "TextParameters$destinationCountryParameters": "<p>A map of country-specific parameters that control one-time passcode delivery.</p>"
      }
    },
    "DestinationIdentity": {
      "base": "<p>Recipient identifier. E.164 phone number for TEXT/VOICE, WhatsApp address for WHATSAPP.</p>",
      "refs": {
        "SendNotifyCodeVerificationInput$destinationIdentity": "<p>The recipient identifier. For the TEXT and VOICE channels, specify an E.164 phone number. For the WhatsApp channel, specify a WhatsApp address.</p>",
        "ValidateNotifyCodeVerificationInput$destinationIdentity": "<p>The recipient identifier. For the TEXT and VOICE channels, specify an E.164 phone number. For the WhatsApp channel, specify a WhatsApp address.</p>"
      }
    },
    "GetBrandProfileAttributeInput": {
      "base": null,
      "refs": {}
    },
    "GetBrandProfileAttributeOutput": {
      "base": null,
      "refs": {}
    },
    "GetBrandProfileInput": {
      "base": null,
      "refs": {}
    },
    "GetBrandProfileOutput": {
      "base": null,
      "refs": {}
    },
    "GetJobInput": {
      "base": null,
      "refs": {}
    },
    "GetNotifyCodeConfigurationInput": {
      "base": null,
      "refs": {}
    },
    "GetNotifyCodeConfigurationOutput": {
      "base": null,
      "refs": {}
    },
    "InlineTemplateBody": {
      "base": "<p>Freeform OTP template body. Must contain at least one non-whitespace character.</p>",
      "refs": {
        "TextParameters$inlineTemplateBody": "<p>The freeform message template used to render the one-time passcode for the SMS or RCS channels. The template must contain the code placeholder.</p>",
        "VoiceParameters$inlineTemplateBody": "<p>The freeform message template used to render the one-time passcode for the voice channel. The template must contain the code placeholder.</p>"
      }
    },
    "Integer": {
      "base": null,
      "refs": {
        "CreateBrandProfileOutput$attributesCreated": "<p>The number of default attributes that were created for the brand profile.</p>"
      }
    },
    "InternalServerException": {
      "base": "<p>An unexpected error occurred during the processing of the request.</p>",
      "refs": {}
    },
    "Job": {
      "base": "<p>Information about an async job tracked by the service. GetJob returns the full <code>Job</code>, which may grow detail-only fields that are not part of the <code>JobSummary</code> list view.</p>",
      "refs": {}
    },
    "JobErrorCode": {
      "base": "<p>Machine-readable code identifying why a job failed.</p>",
      "refs": {
        "Job$errorCode": "<p>A machine-readable code that identifies why the job failed. This value is present only when the job status is FAILED.</p>",
        "JobSummary$errorCode": "<p>A machine-readable code that identifies why the job failed. This value is present only when the job status is FAILED.</p>"
      }
    },
    "JobErrorMessage": {
      "base": "<p>Human-readable description of why a job failed.</p>",
      "refs": {
        "Job$errorMessage": "<p>A human-readable description of why the job failed. This value is present only when the job status is FAILED.</p>",
        "JobSummary$errorMessage": "<p>A human-readable description of why the job failed. This value is present only when the job status is FAILED.</p>"
      }
    },
    "JobId": {
      "base": "<p>System-generated unique identifier for tracking async operations.</p>",
      "refs": {
        "GetJobInput$jobId": "<p>The unique identifier of the asynchronous job. Use the GetJob operation to check the status of the job and to retrieve its results.</p>",
        "Job$jobId": "<p>The unique identifier of the asynchronous job. Use the GetJob operation to check the status of the job and to retrieve its results.</p>",
        "JobResult$jobId": "<p>The unique identifier of the asynchronous job. Use the GetJob operation to check the status of the job and to retrieve its results.</p>",
        "JobSummary$jobId": "<p>The unique identifier of the asynchronous job. Use the GetJob operation to check the status of the job and to retrieve its results.</p>"
      }
    },
    "JobOperationType": {
      "base": "<p>The type of mutating operation that created the job.</p>",
      "refs": {
        "Job$operationType": "<p>The type of mutating operation that created the job.</p>",
        "JobSummary$operationType": "<p>The type of mutating operation that created the job.</p>",
        "ListJobsInput$operationType": "<p>Filters the results to jobs of the specified operation type.</p>"
      }
    },
    "JobResource": {
      "base": "<p>Contains information about a resource that was created or updated by an asynchronous job.</p>",
      "refs": {
        "JobResourceList$member": null
      }
    },
    "JobResourceId": {
      "base": "<p>Identifier of a resource created or updated by a job (registration ID or brand profile ID). This is a distinct type from BrandProfileIdOrArn and RegistrationIdOrArn because:</p> <ol> <li>It represents the <em>result</em> of a job, not an <em>input</em> identifier</li> <li>Jobs can produce different resource types, so this is intentionally generic</li> <li>Semantic clarity: callers see &quot;JobResourceId&quot; and understand it came from a job</li> </ol>",
      "refs": {
        "JobResource$resourceId": "<p>The identifier of the resource that the job created or updated.</p>"
      }
    },
    "JobResourceIdentifier": {
      "base": "<p>Resource identifier echoed back in job results. Can be a registration type, registration ID, or other request-specific identifier.</p>",
      "refs": {
        "JobResult$resourceIdentifier": "<p>The identifier from your request that this job is processing.</p>"
      }
    },
    "JobResourceList": {
      "base": "<p>List of job resources.</p>",
      "refs": {
        "Job$resources": "<p>The resources that were created or updated by the job.</p>",
        "JobSummary$resources": "<p>The resources that were created or updated by the job.</p>"
      }
    },
    "JobResourceType": {
      "base": "<p>Type of resource associated with a job.</p>",
      "refs": {
        "JobResource$resourceType": "<p>The type of the resource that the job created or updated.</p>"
      }
    },
    "JobResult": {
      "base": "<p>Pairs an asynchronous job with the resource identifier from your request that the job processes.</p>",
      "refs": {
        "JobResults$member": null
      }
    },
    "JobResults": {
      "base": "<p>List of job results.</p>",
      "refs": {
        "CreateBrandProfileFromRegistrationOutput$results": "<p>The results of the operation. Each result pairs a requested item with the asynchronous job that processes it.</p>",
        "CreateRegistrationsFromBrandProfileOutput$results": "<p>The results of the operation. Each result pairs a requested item with the asynchronous job that processes it.</p>",
        "UpdateBrandProfileFromRegistrationOutput$results": "<p>The results of the operation. Each result pairs a requested item with the asynchronous job that processes it.</p>",
        "UpdateRegistrationsFromBrandProfileOutput$results": "<p>The results of the operation. Each result pairs a requested item with the asynchronous job that processes it.</p>"
      }
    },
    "JobStatus": {
      "base": "<p>Processing status of an async job.</p>",
      "refs": {
        "Job$status": "<p>The current lifecycle status of the job.</p>",
        "JobSummary$status": "<p>The current lifecycle status of the job.</p>",
        "ListJobsInput$status": "<p>Filters the results to jobs that have the specified status.</p>"
      }
    },
    "JobSummary": {
      "base": "<p>Contains summary information about an asynchronous job in a list response.</p>",
      "refs": {
        "JobSummaryList$member": null
      }
    },
    "JobSummaryList": {
      "base": null,
      "refs": {
        "ListJobsOutput$jobs": "<p>The list of asynchronous jobs.</p>"
      }
    },
    "LanguageCode": {
      "base": "<p>BCP-47 language code for template rendering.</p>",
      "refs": {
        "VoiceParameters$languageCode": "<p>The BCP 47 language code used to render the voice message.</p>",
        "WhatsAppParameters$languageCode": "<p>The BCP 47 language code used to render the template. This value is required for the WhatsApp channel.</p>"
      }
    },
    "ListBrandProfileAttributesInput": {
      "base": null,
      "refs": {}
    },
    "ListBrandProfileAttributesOutput": {
      "base": null,
      "refs": {}
    },
    "ListBrandProfilesInput": {
      "base": null,
      "refs": {}
    },
    "ListBrandProfilesOutput": {
      "base": null,
      "refs": {}
    },
    "ListJobsInput": {
      "base": null,
      "refs": {}
    },
    "ListJobsOutput": {
      "base": null,
      "refs": {}
    },
    "ListNotifyCodeConfigurationsInput": {
      "base": null,
      "refs": {}
    },
    "ListNotifyCodeConfigurationsOutput": {
      "base": null,
      "refs": {}
    },
    "ListRegistrationsFromBrandProfileInput": {
      "base": null,
      "refs": {}
    },
    "ListRegistrationsFromBrandProfileOutput": {
      "base": null,
      "refs": {}
    },
    "ListTagsForResourceInput": {
      "base": null,
      "refs": {}
    },
    "ListTagsForResourceOutput": {
      "base": null,
      "refs": {}
    },
    "Long": {
      "base": null,
      "refs": {
        "GetBrandProfileAttributeOutput$mediaSizeBytes": "<p>The size of the attribute media, in bytes.</p>",
        "UpdateBrandProfileAttributeOutput$mediaSizeBytes": "<p>The size of the attribute media, in bytes.</p>"
      }
    },
    "MaxResults": {
      "base": "<p>Maximum number of results to return on a paginated operation.</p>",
      "refs": {
        "ListBrandProfileAttributesInput$maxResults": "<p>The maximum number of results to return per page.</p>",
        "ListBrandProfilesInput$maxResults": "<p>The maximum number of results to return per page.</p>",
        "ListJobsInput$maxResults": "<p>The maximum number of results to return per page.</p>",
        "ListNotifyCodeConfigurationsInput$maxResults": "<p>The maximum number of results to return per page.</p>",
        "ListRegistrationsFromBrandProfileInput$maxResults": "<p>The maximum number of results to return per page.</p>"
      }
    },
    "MaxVerificationAttempts": {
      "base": "<p>Maximum number of verification attempts allowed (1-5).</p>",
      "refs": {
        "CodeConfigurationParameters$maxAttempts": "<p>The maximum number of validation attempts that are allowed before the verification is locked. Valid values range from 1 through 5. When you do not specify a value, the default is applied when a passcode is sent.</p>",
        "UpdateCodeConfigurationParameters$maxAttempts": "<p>The updated maximum number of validation attempts that are allowed before the verification is locked. Valid values range from 1 through 5. Omit this member to preserve the current value.</p>"
      }
    },
    "MediaDownloadUrl": {
      "base": "<p>Presigned S3 GET URL for downloading attribute media. Marked <code>@sensitive</code> because the URL carries a SigV4 signature that grants object-read for the expiry window (1 hour). Without this trait the value would land in generated SDK <code>Debug</code> output and from there into log retention.</p>",
      "refs": {
        "BrandProfileAttributeOutput$mediaDownloadUrl": "<p>A presigned Amazon S3 URL that you can use to download the attribute media. The URL is valid for one hour and is present only for attributes of type IMAGE or DOCUMENT.</p>",
        "GetBrandProfileAttributeOutput$mediaDownloadUrl": "<p>A presigned Amazon S3 URL that you can use to download the attribute media. The URL is valid for one hour and is present only for attributes of type IMAGE or DOCUMENT.</p>"
      }
    },
    "MessageId": {
      "base": "<p>Service-generated message id for the OTP delivery message.</p>",
      "refs": {
        "SendNotifyCodeVerificationOutput$messageId": "<p>The service-generated identifier for the message that delivers the one-time passcode.</p>"
      }
    },
    "NextToken": {
      "base": "<p>Opaque pagination token.</p>",
      "refs": {
        "ListBrandProfileAttributesInput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListBrandProfileAttributesOutput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListBrandProfilesInput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListBrandProfilesOutput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListJobsInput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListJobsOutput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListNotifyCodeConfigurationsInput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListNotifyCodeConfigurationsOutput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListRegistrationsFromBrandProfileInput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>",
        "ListRegistrationsFromBrandProfileOutput$nextToken": "<p>The token to retrieve the next page of results. This value is returned when more results are available, and is null when there are no more results to return.</p>"
      }
    },
    "NotifyChannel": {
      "base": "<p>Channel used to deliver an OTP to the end user.</p>",
      "refs": {
        "SendNotifyCodeVerificationInput$channel": "<p>The channel used to deliver the one-time passcode to the recipient.</p>"
      }
    },
    "NotifyCodeConfiguration": {
      "base": "<p>Contains the settings of a notify code configuration, which is a reusable one-time passcode policy.</p>",
      "refs": {
        "CreateNotifyCodeConfigurationOutput$notifyCodeConfiguration": "<p>The notify code configuration resource.</p>",
        "GetNotifyCodeConfigurationOutput$notifyCodeConfiguration": "<p>The notify code configuration resource.</p>",
        "NotifyCodeConfigurationList$member": null,
        "UpdateNotifyCodeConfigurationOutput$notifyCodeConfiguration": "<p>The notify code configuration resource.</p>"
      }
    },
    "NotifyCodeConfigurationId": {
      "base": "<p>Bare system-generated NotifyCodeConfiguration identifier (output-only). Always a bare id, never an ARN — the ARN is carried separately by <code>NotifyCodeConfiguration$notifyCodeConfigurationArn</code>. Identifiers are opaque tokens; clients must not assume a specific length or format.</p>",
      "refs": {
        "NotifyCodeConfiguration$notifyCodeConfigurationId": "<p>The unique identifier of the notify code configuration.</p>"
      }
    },
    "NotifyCodeConfigurationIdOrArn": {
      "base": "<p>System-generated NotifyCodeConfiguration identifier or full ARN. Accepts either a bare id or a full ARN (e.g., &quot;arn:aws:end-user-messaging:us-east-1:123456789012:notify-code-configuration/<id>&quot;). Identifiers are opaque tokens; clients must not assume a specific length or format. SDKs handle percent-encoding of ARN characters in path parameters transparently.</p>",
      "refs": {
        "DeleteNotifyCodeConfigurationInput$notifyCodeConfigurationId": "<p>The unique identifier of the notify code configuration. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "GetNotifyCodeConfigurationInput$notifyCodeConfigurationId": "<p>The unique identifier of the notify code configuration. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>",
        "SendNotifyCodeVerificationInput$notifyCodeConfiguration": "<p>The identifier or Amazon Resource Name (ARN) of the notify code configuration that supplies the passcode policy and template defaults. When you do not specify a configuration, you must supply the template in the request.</p>",
        "UpdateNotifyCodeConfigurationInput$notifyCodeConfigurationId": "<p>The unique identifier of the notify code configuration. You can specify either the bare ID or the full Amazon Resource Name (ARN).</p>"
      }
    },
    "NotifyCodeConfigurationList": {
      "base": null,
      "refs": {
        "ListNotifyCodeConfigurationsOutput$notifyCodeConfigurations": "<p>The list of notify code configurations.</p>"
      }
    },
    "NotifyCodeConfigurationName": {
      "base": "<p>Customer-provided NotifyCodeConfiguration display name. Alphanumeric, underscore, hyphen, and space only.</p>",
      "refs": {
        "CreateNotifyCodeConfigurationInput$notifyCodeConfigurationName": "<p>The name of the notify code configuration.</p>",
        "NotifyCodeConfiguration$notifyCodeConfigurationName": "<p>The name of the notify code configuration.</p>",
        "UpdateNotifyCodeConfigurationInput$notifyCodeConfigurationName": "<p>The name of the notify code configuration.</p>"
      }
    },
    "NotifyParameters": {
      "base": "<p>The delivery parameters for the preapproved notify-template route over the SMS or voice channels.</p>",
      "refs": {
        "ChannelParameters$notify": "<p>The parameters for the preapproved notify-template route over the SMS or voice channels.</p>"
      }
    },
    "NotifyTemplateId": {
      "base": "<p>Pre-approved SMS / Voice notify template identifier.</p>",
      "refs": {
        "NotifyParameters$notifyTemplateId": "<p>The identifier of a preapproved notify template for the SMS or voice channels.</p>"
      }
    },
    "OnAttributeConflict": {
      "base": "<p>Strategy for merging registration data into brand profile attributes.</p>",
      "refs": {
        "UpdateBrandProfileFromRegistrationInput$onAttributeConflict": "<p>Specifies how the service resolves an attribute that already exists. REPLACE overwrites the existing value with the incoming value. PRESERVE keeps the existing value.</p>",
        "UpdateRegistrationsFromBrandProfileInput$onAttributeConflict": "<p>Specifies how the service resolves an attribute that already exists. REPLACE overwrites the existing value with the incoming value. PRESERVE keeps the existing value.</p>"
      }
    },
    "OriginationIdentity": {
      "base": "<p>Sender identifier. Phone number ARN, sender ID, or pool ARN owned by the caller's account.</p>",
      "refs": {
        "SendNotifyCodeVerificationInput$originationIdentity": "<p>The identity used to send the message, such as a phone number, sender ID, or pool that is owned by your account.</p>"
      }
    },
    "ReferenceId": {
      "base": "<p>Caller-supplied reference id used to bind a Send to a subsequent Validate request.</p>",
      "refs": {
        "SendNotifyCodeVerificationInput$referenceId": "<p>A caller-supplied reference identifier that binds a send request to a later validate request. Specify the same value in both requests.</p>",
        "ValidateNotifyCodeVerificationInput$referenceId": "<p>The caller-supplied reference identifier used to locate the verification. This value must match the value that you supplied to the SendNotifyCodeVerification operation.</p>"
      }
    },
    "RegistrationAssociationSummary": {
      "base": "<p>Contains summary information about a registration that is associated with a brand profile.</p>",
      "refs": {
        "RegistrationAssociationSummaryList$member": null
      }
    },
    "RegistrationAssociationSummaryList": {
      "base": null,
      "refs": {
        "ListRegistrationsFromBrandProfileOutput$registrationAssociations": "<p>The list of registrations that are associated with the brand profile.</p>"
      }
    },
    "RegistrationId": {
      "base": "<p>Bare registration identifier (output-only). Always a bare ID, never an ARN.</p>",
      "refs": {
        "RegistrationAssociationSummary$registrationId": "<p>The identifier of the registration.</p>"
      }
    },
    "RegistrationIdList": {
      "base": null,
      "refs": {
        "UpdateRegistrationsFromBrandProfileInput$registrationIds": "<p>The identifiers of the registrations.</p>"
      }
    },
    "RegistrationIdOrArn": {
      "base": "<p>Registration identifier or ARN.</p>",
      "refs": {
        "CreateBrandProfileFromRegistrationInput$registrationId": "<p>The identifier or Amazon Resource Name (ARN) of the registration to populate the brand profile from.</p>",
        "RegistrationIdList$member": null,
        "UpdateBrandProfileFromRegistrationInput$registrationId": "<p>The identifier or Amazon Resource Name (ARN) of the registration to import attributes from.</p>"
      }
    },
    "RegistrationType": {
      "base": "<p>Registration type identifier (e.g., US_TOLL_FREE_REGISTRATION, SENDER_ID).</p>",
      "refs": {
        "RegistrationAssociationSummary$registrationType": "<p>The type of the registration, for example US_TOLL_FREE_REGISTRATION or SENDER_ID.</p>",
        "RegistrationTypeList$member": null
      }
    },
    "RegistrationTypeList": {
      "base": null,
      "refs": {
        "CreateRegistrationsFromBrandProfileInput$registrationTypes": "<p>The registration types to create, for example US_TOLL_FREE_REGISTRATION or SENDER_ID.</p>"
      }
    },
    "ResourceNotFoundException": {
      "base": "<p>The request references a resource that does not exist. Verify that the resource identifier is correct and try your request again.</p>",
      "refs": {}
    },
    "SendNotifyCodeVerificationInput": {
      "base": null,
      "refs": {}
    },
    "SendNotifyCodeVerificationOutput": {
      "base": null,
      "refs": {}
    },
    "ServiceQuotaExceededException": {
      "base": "<p>The request would exceed a service quota for your account.</p>",
      "refs": {}
    },
    "Status": {
      "base": "<p>Brand profile lifecycle status. Exposed on brand profile API responses (Get, List, Create, Update).</p>",
      "refs": {
        "BrandProfileInfo$status": "<p>The current lifecycle status of the brand profile.</p>",
        "CreateBrandProfileOutput$status": "<p>The current lifecycle status of the brand profile.</p>",
        "GetBrandProfileOutput$status": "<p>The current lifecycle status of the brand profile.</p>",
        "UpdateBrandProfileOutput$status": "<p>The current lifecycle status of the brand profile.</p>"
      }
    },
    "String": {
      "base": null,
      "refs": {
        "AccessDeniedException$message": null,
        "ConflictException$message": null,
        "ConflictException$resourceId": "<p>The identifier of the resource that the request conflicts with.</p>",
        "ConflictException$resourceType": "<p>The type of the resource that the request conflicts with.</p>",
        "GetBrandProfileAttributeOutput$mediaContentType": "<p>The MIME content type of the attribute media.</p>",
        "InternalServerException$message": null,
        "ResourceNotFoundException$message": null,
        "ResourceNotFoundException$resourceId": "<p>The identifier of the resource that could not be found.</p>",
        "ResourceNotFoundException$resourceType": "<p>The type of the resource that could not be found.</p>",
        "ServiceQuotaExceededException$message": null,
        "ThrottlingException$message": null,
        "UpdateBrandProfileAttributeOutput$mediaContentType": "<p>The MIME content type of the attribute media.</p>",
        "ValidationException$message": "<p>A summary of the validation failure.</p>",
        "ValidationExceptionField$path": "<p>A JSONPointer expression to the structure member whose value failed to satisfy the modeled constraints.</p>",
        "ValidationExceptionField$message": "<p>A detailed description of the validation failure.</p>"
      }
    },
    "Tag": {
      "base": "<p>Describes a tag as a key and value pair that you can associate with a resource.</p>",
      "refs": {
        "TagList$member": null,
        "TagResourceInputTagsList$member": null
      }
    },
    "TagKey": {
      "base": "<p>The key of the tag. Tag keys are case-sensitive and must be unique per resource.</p>",
      "refs": {
        "Tag$key": "<p>The key of the tag.</p>",
        "UntagResourceInputTagKeysList$member": null
      }
    },
    "TagList": {
      "base": null,
      "refs": {
        "CreateBrandProfileFromRegistrationInput$tags": "<p>An array of key and value pair tags that are associated with the resource.</p>",
        "CreateBrandProfileInput$tags": "<p>An array of key and value pair tags that are associated with the resource.</p>",
        "CreateNotifyCodeConfigurationInput$tags": "<p>An array of key and value pair tags that are associated with the resource.</p>",
        "ListTagsForResourceOutput$tags": "<p>An array of key and value pair tags that are associated with the resource.</p>"
      }
    },
    "TagResourceInput": {
      "base": null,
      "refs": {}
    },
    "TagResourceInputTagsList": {
      "base": null,
      "refs": {
        "TagResourceInput$tags": "<p>An array of key and value pair tags that are associated with the resource.</p>"
      }
    },
    "TagResourceOutput": {
      "base": null,
      "refs": {}
    },
    "TagValue": {
      "base": "<p>The value of the tag associated with the tag key. May be an empty string.</p>",
      "refs": {
        "Tag$value": "<p>The value of the tag.</p>"
      }
    },
    "TextParameters": {
      "base": "<p>The delivery parameters for the text channel, which delivers over SMS or RCS.</p>",
      "refs": {
        "ChannelParameters$text": "<p>The parameters for the text channel, which delivers over SMS or RCS.</p>"
      }
    },
    "ThrottlingException": {
      "base": "<p>The request was denied because it exceeded the allowed request rate.</p>",
      "refs": {}
    },
    "Timestamp": {
      "base": null,
      "refs": {
        "BrandProfileAttributeSummary$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "BrandProfileAttributeSummary$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "BrandProfileInfo$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "BrandProfileInfo$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "CreateBrandProfileOutput$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "CreateBrandProfileOutput$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "GetBrandProfileAttributeOutput$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "GetBrandProfileAttributeOutput$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "GetBrandProfileOutput$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "GetBrandProfileOutput$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "Job$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "Job$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "JobSummary$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "JobSummary$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "NotifyCodeConfiguration$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "NotifyCodeConfiguration$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "RegistrationAssociationSummary$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "UpdateBrandProfileAttributeOutput$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "UpdateBrandProfileAttributeOutput$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>",
        "UpdateBrandProfileOutput$createdAt": "<p>The time when the resource was created, in Unix epoch time.</p>",
        "UpdateBrandProfileOutput$updatedAt": "<p>The time when the resource was last updated, in Unix epoch time.</p>"
      }
    },
    "UntagResourceInput": {
      "base": null,
      "refs": {}
    },
    "UntagResourceInputTagKeysList": {
      "base": null,
      "refs": {
        "UntagResourceInput$tagKeys": "<p>The list of tag keys to remove from the resource.</p>"
      }
    },
    "UntagResourceOutput": {
      "base": null,
      "refs": {}
    },
    "UpdateBrandProfileAttributeInput": {
      "base": null,
      "refs": {}
    },
    "UpdateBrandProfileAttributeOutput": {
      "base": null,
      "refs": {}
    },
    "UpdateBrandProfileFromRegistrationInput": {
      "base": null,
      "refs": {}
    },
    "UpdateBrandProfileFromRegistrationOutput": {
      "base": null,
      "refs": {}
    },
    "UpdateBrandProfileInput": {
      "base": null,
      "refs": {}
    },
    "UpdateBrandProfileOutput": {
      "base": null,
      "refs": {}
    },
    "UpdateChannelParameters": {
      "base": "<p>The updated channel-specific parameters used only when you update a notify code configuration. When you omit a channel, that channel's parameters remain unchanged. When you supply a channel, you can clear individual fields by using the empty-string or empty-map sentinel on a member, or drop the whole channel's parameters by clearing every member. These sentinels apply only when you update a configuration; a create request rejects empty values with a validation error.</p>",
      "refs": {
        "UpdateNotifyCodeConfigurationInput$channelParameters": "<p>The updated channel-specific parameters used to render and deliver the one-time passcode. This is a loose, nested update: when you omit a channel, that channel's parameters remain unchanged. Within a supplied channel, an empty string on a string member, or an empty map on the destination-country parameters, clears the currently stored value, and absent members preserve the current value.</p>"
      }
    },
    "UpdateCodeConfigurationParameters": {
      "base": "<p>The loose variant of the passcode policy parameters that is used only when you update a notify code configuration. When you omit a member, its current value is preserved.</p>",
      "refs": {
        "UpdateNotifyCodeConfigurationInput$codeConfigurationParameters": "<p>The updated passcode policy parameters, including the code type, length, validity period, and maximum number of attempts. When you omit a member, its current value is preserved.</p>"
      }
    },
    "UpdateDestinationCountryParameters": {
      "base": "<p>Loose variant of <code>DestinationCountryParameters</code> used only in <code>UpdateNotifyCodeConfigurationInput</code>. Accepts an empty map as the sentinel to clear the persisted attribute.</p>",
      "refs": {
        "UpdateTextParameters$destinationCountryParameters": "<p>The updated map of country-specific parameters that control one-time passcode delivery. An empty map clears the previously stored value.</p>"
      }
    },
    "UpdateInlineTemplateBody": {
      "base": "<p>Loose variant of <code>InlineTemplateBody</code> used only in <code>UpdateNotifyCodeConfigurationInput</code>. Empty (<code>&quot;&quot;</code>) is the clear sentinel; any non-empty value must satisfy the same character class as <code>InlineTemplateBody</code> (at least one non-whitespace character).</p>",
      "refs": {
        "UpdateTextParameters$inlineTemplateBody": "<p>The updated freeform SMS or RCS template body. An empty string clears the previously stored value.</p>",
        "UpdateVoiceParameters$inlineTemplateBody": "<p>The updated freeform voice template body. An empty string clears the previously stored value.</p>"
      }
    },
    "UpdateLanguageCode": {
      "base": "<p>Loose variant of <code>LanguageCode</code> used only in <code>UpdateNotifyCodeConfigurationInput</code>. Empty (<code>&quot;&quot;</code>) is the clear sentinel; any non-empty value must satisfy the same character class as <code>LanguageCode</code> (2-35 non-whitespace characters — BCP-47 tag).</p>",
      "refs": {
        "UpdateVoiceParameters$languageCode": "<p>The updated BCP 47 language code. An empty string clears the previously stored value.</p>",
        "UpdateWhatsAppParameters$languageCode": "<p>The updated BCP 47 language code. An empty string clears the previously stored value.</p>"
      }
    },
    "UpdateNotifyCodeConfigurationInput": {
      "base": null,
      "refs": {}
    },
    "UpdateNotifyCodeConfigurationOutput": {
      "base": null,
      "refs": {}
    },
    "UpdateNotifyParameters": {
      "base": "<p>The updated delivery parameters for the preapproved notify-template route. Absent members preserve the current value, and the empty sentinel on a member clears it.</p>",
      "refs": {
        "UpdateChannelParameters$notify": "<p>The notify-template-route parameters to update. Omit this member to leave them unchanged.</p>"
      }
    },
    "UpdateNotifyTemplateId": {
      "base": "<p>Loose variant of <code>NotifyTemplateId</code> used only in <code>UpdateNotifyCodeConfigurationInput</code>. Empty (<code>&quot;&quot;</code>) is the clear sentinel; any non-empty value must satisfy the same character class as <code>NotifyTemplateId</code> (<code>[A-Za-z0-9_-]</code>).</p>",
      "refs": {
        "UpdateNotifyParameters$notifyTemplateId": "<p>The updated identifier of a preapproved notify template for the SMS or voice channels. An empty string clears the previously stored value.</p>"
      }
    },
    "UpdateRegistrationsFromBrandProfileInput": {
      "base": null,
      "refs": {}
    },
    "UpdateRegistrationsFromBrandProfileOutput": {
      "base": null,
      "refs": {}
    },
    "UpdateTextParameters": {
      "base": "<p>The updated delivery parameters for the text channel. Absent members preserve the current value, and the empty sentinel on a member clears it.</p>",
      "refs": {
        "UpdateChannelParameters$text": "<p>The text-channel parameters to update. Omit this member to leave the text-channel parameters unchanged.</p>"
      }
    },
    "UpdateVoiceId": {
      "base": "<p>Loose variant of <code>VoiceId</code> used only in <code>UpdateNotifyCodeConfigurationInput</code>. Empty (<code>&quot;&quot;</code>) is the clear sentinel; any non-empty value must satisfy the same character class as <code>VoiceId</code> (<code>[A-Za-z0-9]</code>).</p>",
      "refs": {
        "UpdateNotifyParameters$voiceId": "<p>The updated Amazon Polly voice ID. An empty string clears the previously stored value.</p>",
        "UpdateVoiceParameters$voiceId": "<p>The updated Amazon Polly voice ID. An empty string clears the previously stored value.</p>"
      }
    },
    "UpdateVoiceParameters": {
      "base": "<p>The updated delivery parameters for the voice channel. Absent members preserve the current value, and the empty sentinel on a member clears it.</p>",
      "refs": {
        "UpdateChannelParameters$voice": "<p>The voice-channel parameters to update. Omit this member to leave the voice-channel parameters unchanged.</p>"
      }
    },
    "UpdateWhatsAppParameters": {
      "base": "<p>The updated delivery parameters for the WhatsApp channel. Absent members preserve the current value, and the empty sentinel on a member clears it.</p>",
      "refs": {
        "UpdateChannelParameters$whatsApp": "<p>The WhatsApp-channel parameters to update. Omit this member to leave the WhatsApp-channel parameters unchanged.</p>"
      }
    },
    "UpdateWhatsAppTemplateName": {
      "base": "<p>Loose variant of <code>WhatsAppTemplateName</code> used only in <code>UpdateNotifyCodeConfigurationInput</code>. Empty (<code>&quot;&quot;</code>) is the clear sentinel; non-empty values are validated by the service (lowercase letters, numbers, underscores).</p>",
      "refs": {
        "UpdateWhatsAppParameters$whatsAppTemplateName": "<p>The updated name of the Meta-approved WhatsApp authentication template. An empty string clears the previously stored value.</p>"
      }
    },
    "ValidateNotifyCodeVerificationInput": {
      "base": null,
      "refs": {}
    },
    "ValidateNotifyCodeVerificationOutput": {
      "base": null,
      "refs": {}
    },
    "ValidationException": {
      "base": "<p>A standard error for input validation failures. This should be thrown by services when a member of the input structure falls outside of the modeled or documented constraints.</p>",
      "refs": {}
    },
    "ValidationExceptionField": {
      "base": "<p>Describes one specific validation failure for an input member.</p>",
      "refs": {
        "ValidationExceptionFieldList$member": null
      }
    },
    "ValidationExceptionFieldList": {
      "base": null,
      "refs": {
        "ValidationException$fieldList": "<p>A list of specific failures encountered while validating the input. A member can appear in this list more than once if it failed to satisfy multiple constraints.</p>"
      }
    },
    "ValidityPeriodMinutes": {
      "base": "<p>OTP validity window in minutes (1-60).</p>",
      "refs": {
        "CodeConfigurationParameters$validityPeriodMinutes": "<p>The length of time, in minutes, that the one-time passcode remains valid. Valid values range from 1 through 60. When you do not specify a value, the default is applied when a passcode is sent.</p>",
        "UpdateCodeConfigurationParameters$validityPeriodMinutes": "<p>The updated length of time, in minutes, that the one-time passcode remains valid. Valid values range from 1 through 60. Omit this member to preserve the current value.</p>"
      }
    },
    "VerificationCode": {
      "base": "<p>OTP code submitted by the end user for validation.</p>",
      "refs": {
        "ValidateNotifyCodeVerificationInput$code": "<p>The one-time passcode that the recipient submitted for validation.</p>"
      }
    },
    "VerificationId": {
      "base": "<p>Service-generated verification id returned from SendNotifyCodeVerification.</p>",
      "refs": {
        "SendNotifyCodeVerificationOutput$verificationId": "<p>The service-generated identifier for the verification.</p>"
      }
    },
    "VerificationStatus": {
      "base": "<p>Outcome of a ValidateNotifyCodeVerification request.</p>",
      "refs": {
        "ValidateNotifyCodeVerificationOutput$status": "<p>The outcome of the validation attempt. VALID indicates that the submitted passcode matched an active verification. INVALID indicates that the passcode did not match, expired, or exceeded its attempt limit.</p>"
      }
    },
    "VoiceId": {
      "base": "<p>Amazon Polly voice id for the Voice channel.</p>",
      "refs": {
        "NotifyParameters$voiceId": "<p>The Amazon Polly voice ID used when the notify template is delivered over the voice channel.</p>",
        "VoiceParameters$voiceId": "<p>The Amazon Polly voice ID used for the voice channel.</p>"
      }
    },
    "VoiceMessageBodyTextType": {
      "base": "<p>The format of the voice message body text.</p>",
      "refs": {
        "UpdateVoiceParameters$voiceMessageBodyTextType": "<p>The updated format of the voice message body. Valid values are TEXT and SSML. Omit this member to preserve the current value.</p>",
        "VoiceParameters$voiceMessageBodyTextType": "<p>The format of the voice message body. Valid values are TEXT and SSML.</p>"
      }
    },
    "VoiceParameters": {
      "base": "<p>The delivery parameters for the voice channel.</p>",
      "refs": {
        "ChannelParameters$voice": "<p>The parameters for the voice channel.</p>"
      }
    },
    "WhatsAppParameters": {
      "base": "<p>The delivery parameters for the WhatsApp channel.</p>",
      "refs": {
        "ChannelParameters$whatsApp": "<p>The parameters for the WhatsApp channel.</p>"
      }
    },
    "WhatsAppTemplateName": {
      "base": "<p>Meta-approved WhatsApp authentication template name. Character-class rules (lowercase letters, numbers, underscores) are enforced by the service.</p>",
      "refs": {
        "WhatsAppParameters$whatsAppTemplateName": "<p>The name of the Meta-approved WhatsApp authentication template.</p>"
      }
    }
  }
}
